コード例 #1
0
        /// <summary>
        /// Adds the audio stream.
        /// </summary>
        /// <param name="streams">The streams.</param>
        /// <param name="audioStream">The audio stream.</param>
        private void AddAudioStream(List <MediaStream> streams, TSAudioStream audioStream)
        {
            var stream = new MediaStream
            {
                Codec      = audioStream.CodecShortName,
                Language   = audioStream.LanguageCode,
                Channels   = audioStream.ChannelCount,
                SampleRate = audioStream.SampleRate,
                Type       = MediaStreamType.Audio,
                Index      = streams.Count
            };

            var bitrate = Convert.ToInt32(audioStream.BitRate);

            if (bitrate > 0)
            {
                stream.BitRate = bitrate;
            }

            if (audioStream.LFE > 0)
            {
                stream.Channels = audioStream.ChannelCount + 1;
            }

            streams.Add(stream);
        }
コード例 #2
0
 /// <summary>
 /// Adds the audio stream.
 /// </summary>
 /// <param name="streams">The streams.</param>
 /// <param name="audioStream">The audio stream.</param>
 private void AddAudioStream(List <MediaStream> streams, TSAudioStream audioStream)
 {
     streams.Add(new MediaStream
     {
         BitRate    = Convert.ToInt32(audioStream.BitRate),
         Codec      = audioStream.CodecShortName,
         Language   = audioStream.LanguageCode,
         Channels   = audioStream.ChannelCount,
         SampleRate = audioStream.SampleRate,
         Type       = MediaStreamType.Audio,
         Index      = streams.Count
     });
 }
コード例 #3
0
ファイル: TSCodecDTSHD.cs プロジェクト: JGTM2016/bdhero
        public static void Scan(
            TSAudioStream stream,
            TSStreamBuffer buffer,
            long bitrate,
            ref string tag)
        {
            if (stream.IsInitialized &&
                (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO ||
                (stream.CoreStream != null &&
                 stream.CoreStream.IsInitialized))) return;

            bool syncFound = false;
            uint sync = 0;
            for (int i = 0; i < buffer.Length; i++)
            {
                sync = (sync << 8) + buffer.ReadByte();
                if (sync == 0x64582025)
                {
                    syncFound = true;
                    break;
                }
            }

            if (!syncFound)
            {
                tag = "CORE";
                if (stream.CoreStream == null)
                {
                    stream.CoreStream = new TSAudioStream();
                    stream.CoreStream.StreamType = TSStreamType.DTS_AUDIO;
                }
                if (!stream.CoreStream.IsInitialized)
                {
                    buffer.BeginRead();
                    TSCodecDTS.Scan(stream.CoreStream, buffer, bitrate, ref tag);
                }
                return;
            }

            tag = "HD";
            int temp1 = buffer.ReadBits(8);
            int nuSubStreamIndex = buffer.ReadBits(2);
            int nuExtSSHeaderSize = 0;
            int nuExtSSFSize = 0;
            int bBlownUpHeader = buffer.ReadBits(1);
            if (1 == bBlownUpHeader)
            {
                nuExtSSHeaderSize = buffer.ReadBits(12) + 1;
                nuExtSSFSize = buffer.ReadBits(20) + 1;
            }
            else
            {
                nuExtSSHeaderSize = buffer.ReadBits(8) + 1;
                nuExtSSFSize = buffer.ReadBits(16) + 1;
            }
            int nuNumAudioPresent = 1;
            int nuNumAssets = 1;
            int bStaticFieldsPresent = buffer.ReadBits(1);
            if (1 == bStaticFieldsPresent)
            {
                int nuRefClockCode = buffer.ReadBits(2);
                int nuExSSFrameDurationCode = buffer.ReadBits(3) + 1;
                long nuTimeStamp = 0;
                if (1 == buffer.ReadBits(1))
                {
                    nuTimeStamp = (buffer.ReadBits(18) << 18) + buffer.ReadBits(18);
                }
                nuNumAudioPresent = buffer.ReadBits(3) + 1;
                nuNumAssets = buffer.ReadBits(3) + 1;
                int[] nuActiveExSSMask = new int[nuNumAudioPresent];
                for (int i = 0; i < nuNumAudioPresent; i++)
                {
                    nuActiveExSSMask[i] = buffer.ReadBits(nuSubStreamIndex + 1); //?
                }
                for (int i = 0; i < nuNumAudioPresent; i++)
                {
                    for (int j = 0; j < nuSubStreamIndex + 1; j++)
                    {
                        if (((j + 1) % 2) == 1)
                        {
                            int mask = buffer.ReadBits(8);
                        }
                    }
                }
                if (1 == buffer.ReadBits(1))
                {
                    int nuMixMetadataAdjLevel = buffer.ReadBits(2);
                    int nuBits4MixOutMask = buffer.ReadBits(2) * 4 + 4;
                    int nuNumMixOutConfigs = buffer.ReadBits(2) + 1;
                    int[] nuMixOutChMask = new int[nuNumMixOutConfigs];
                    for (int i = 0; i < nuNumMixOutConfigs; i++)
                    {
                        nuMixOutChMask[i] = buffer.ReadBits(nuBits4MixOutMask);
                    }
                }
            }
            int[] AssetSizes = new int[nuNumAssets];
            for (int i = 0; i < nuNumAssets; i++)
            {
                if (1 == bBlownUpHeader)
                {
                    AssetSizes[i] = buffer.ReadBits(20) + 1;
                }
                else
                {
                    AssetSizes[i] = buffer.ReadBits(16) + 1;
                }                
            }
            for (int i = 0; i < nuNumAssets; i++)
            {
                long bufferPosition = buffer.Position;
                int nuAssetDescriptorFSIZE = buffer.ReadBits(9) + 1;
                int DescriptorDataForAssetIndex = buffer.ReadBits(3);
                if (1 == bStaticFieldsPresent)
                {
                    int AssetTypeDescrPresent = buffer.ReadBits(1);
                    if (1 == AssetTypeDescrPresent)
                    {
                        int AssetTypeDescriptor = buffer.ReadBits(4);
                    }
                    int LanguageDescrPresent = buffer.ReadBits(1);
                    if (1 == LanguageDescrPresent)
                    {
                        int LanguageDescriptor = buffer.ReadBits(24);
                    }
                    int bInfoTextPresent = buffer.ReadBits(1);
                    if (1 == bInfoTextPresent)
                    {
                        int nuInfoTextByteSize = buffer.ReadBits(10) + 1;
                        int[] InfoText = new int[nuInfoTextByteSize];
                        for (int j = 0; j < nuInfoTextByteSize; j++)
                        {
                            InfoText[j] = buffer.ReadBits(8);
                        }
                    }
                    int nuBitResolution = buffer.ReadBits(5) + 1;
                    int nuMaxSampleRate = buffer.ReadBits(4);
                    int nuTotalNumChs = buffer.ReadBits(8) + 1;
                    int bOne2OneMapChannels2Speakers = buffer.ReadBits(1);
                    int nuSpkrActivityMask = 0;
                    if (1 == bOne2OneMapChannels2Speakers)
                    {
                        int bEmbeddedStereoFlag = 0;
                        if (nuTotalNumChs > 2)
                        {
                            bEmbeddedStereoFlag = buffer.ReadBits(1);
                        }
                        int bEmbeddedSixChFlag = 0;
                        if (nuTotalNumChs > 6)
                        {
                            bEmbeddedSixChFlag = buffer.ReadBits(1);
                        }
                        int bSpkrMaskEnabled = buffer.ReadBits(1);
                        int nuNumBits4SAMask = 0;
                        if (1 == bSpkrMaskEnabled)
                        {
                            nuNumBits4SAMask = buffer.ReadBits(2);
                            nuNumBits4SAMask = nuNumBits4SAMask * 4 + 4;
                            nuSpkrActivityMask = buffer.ReadBits(nuNumBits4SAMask);
                        }
                        // TODO...
                    }
                    stream.SampleRate = SampleRates[nuMaxSampleRate];
                    stream.BitDepth = nuBitResolution;
                    
                    stream.LFE = 0;
                    if ((nuSpkrActivityMask & 0x8) == 0x8)
                    {
                        ++stream.LFE;
                    }
                    if ((nuSpkrActivityMask & 0x1000) == 0x1000)
                    {
                        ++stream.LFE;
                    }
                    stream.ChannelCount = nuTotalNumChs - stream.LFE;
                }
                if (nuNumAssets > 1)
                {
                    // TODO...
                    break;
                }
            }

            // TODO
            if (stream.CoreStream != null)
            {
                TSAudioStream coreStream = (TSAudioStream)stream.CoreStream;
                if (coreStream.AudioMode == TSAudioMode.Extended &&
                    stream.ChannelCount == 5)
                {
                    stream.AudioMode = TSAudioMode.Extended;
                }
                /*
                if (coreStream.DialNorm != 0)
                {
                    stream.DialNorm = coreStream.DialNorm;
                }
                */
            }

            if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO)
            {
                stream.IsVBR = true;
                stream.IsInitialized = true;
            }
            else if (bitrate > 0)
            {
                stream.IsVBR = false;
                stream.BitRate = bitrate;
                if (stream.CoreStream != null)
                {
                    stream.BitRate += stream.CoreStream.BitRate;
                    stream.IsInitialized = true;
                }
                stream.IsInitialized = (stream.BitRate > 0 ? true : false);
            }            
        }
コード例 #4
0
        public static void Scan(
            TSAudioStream stream,
            TSStreamBuffer buffer,
            long bitrate,
            ref string tag)
        {
            if (stream.IsInitialized)
            {
                return;
            }

            bool syncFound = false;
            uint sync      = 0;

            for (int i = 0; i < buffer.Length; i++)
            {
                sync = (sync << 8) + buffer.ReadByte();
                if (sync == 0x7FFE8001)
                {
                    syncFound = true;
                    break;
                }
            }
            if (!syncFound)
            {
                return;
            }

            int frame_type      = buffer.ReadBits(1);
            int samples_deficit = buffer.ReadBits(5);
            int crc_present     = buffer.ReadBits(1);
            int sample_blocks   = buffer.ReadBits(7);
            int frame_size      = buffer.ReadBits(14);

            if (frame_size < 95)
            {
                return;
            }
            int amode       = buffer.ReadBits(6);
            int sample_rate = buffer.ReadBits(4);

            if (sample_rate < 0 || sample_rate >= dca_sample_rates.Length)
            {
                return;
            }
            int bit_rate = buffer.ReadBits(5);

            if (bit_rate < 0 || bit_rate >= dca_bit_rates.Length)
            {
                return;
            }
            int downmix           = buffer.ReadBits(1);
            int dynrange          = buffer.ReadBits(1);
            int timestamp         = buffer.ReadBits(1);
            int aux_data          = buffer.ReadBits(1);
            int hdcd              = buffer.ReadBits(1);
            int ext_descr         = buffer.ReadBits(3);
            int ext_coding        = buffer.ReadBits(1);
            int aspf              = buffer.ReadBits(1);
            int lfe               = buffer.ReadBits(2);
            int predictor_history = buffer.ReadBits(1);

            if (crc_present == 1)
            {
                int crc = buffer.ReadBits(16);
            }
            int multirate_inter = buffer.ReadBits(1);
            int version         = buffer.ReadBits(4);
            int copy_history    = buffer.ReadBits(2);
            int source_pcm_res  = buffer.ReadBits(3);
            int front_sum       = buffer.ReadBits(1);
            int surround_sum    = buffer.ReadBits(1);
            int dialog_norm     = buffer.ReadBits(4);

            if (source_pcm_res < 0 || source_pcm_res >= dca_bits_per_sample.Length)
            {
                return;
            }
            int subframes      = buffer.ReadBits(4);
            int total_channels = buffer.ReadBits(3) + 1 + ext_coding;

            stream.SampleRate   = dca_sample_rates[sample_rate];
            stream.ChannelCount = total_channels;
            stream.LFE          = (lfe > 0 ? 1 : 0);
            stream.BitDepth     = dca_bits_per_sample[source_pcm_res];
            stream.DialNorm     = -dialog_norm;
            if ((source_pcm_res & 0x1) == 0x1)
            {
                stream.AudioMode = TSAudioMode.Extended;
            }

            stream.BitRate = (uint)dca_bit_rates[bit_rate];
            switch (stream.BitRate)
            {
            case 1:
                if (bitrate > 0)
                {
                    stream.BitRate       = bitrate;
                    stream.IsVBR         = false;
                    stream.IsInitialized = true;
                }
                else
                {
                    stream.BitRate = 0;
                }
                break;

            case 2:
            case 3:
                stream.IsVBR         = true;
                stream.IsInitialized = true;
                break;

            default:
                stream.IsVBR         = false;
                stream.IsInitialized = true;
                break;
            }
        }
コード例 #5
0
ファイル: TSCodecLPCM.cs プロジェクト: rafntor/bdhero
        public static void Scan(
            TSAudioStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            if (stream.IsInitialized)
            {
                return;
            }

            byte[] header = buffer.ReadBytes(4);
            int    flags  = (header[2] << 8) + header[3];

            switch ((flags & 0xF000) >> 12)
            {
            case 1:     // 1/0/0
                stream.ChannelCount = 1;
                stream.LFE          = 0;
                break;

            case 3:     // 2/0/0
                stream.ChannelCount = 2;
                stream.LFE          = 0;
                break;

            case 4:     // 3/0/0
                stream.ChannelCount = 3;
                stream.LFE          = 0;
                break;

            case 5:     // 2/1/0
                stream.ChannelCount = 3;
                stream.LFE          = 0;
                break;

            case 6:     // 3/1/0
                stream.ChannelCount = 4;
                stream.LFE          = 0;
                break;

            case 7:     // 2/2/0
                stream.ChannelCount = 4;
                stream.LFE          = 0;
                break;

            case 8:     // 3/2/0
                stream.ChannelCount = 5;
                stream.LFE          = 0;
                break;

            case 9:     // 3/2/1
                stream.ChannelCount = 5;
                stream.LFE          = 1;
                break;

            case 10:     // 3/4/0
                stream.ChannelCount = 7;
                stream.LFE          = 0;
                break;

            case 11:     // 3/4/1
                stream.ChannelCount = 7;
                stream.LFE          = 1;
                break;

            default:
                stream.ChannelCount = 0;
                stream.LFE          = 0;
                break;
            }

            switch ((flags & 0xC0) >> 6)
            {
            case 1:
                stream.BitDepth = 16;
                break;

            case 2:
                stream.BitDepth = 20;
                break;

            case 3:
                stream.BitDepth = 24;
                break;

            default:
                stream.BitDepth = 0;
                break;
            }

            switch ((flags & 0xF00) >> 8)
            {
            case 1:
                stream.SampleRate = 48000;
                break;

            case 4:
                stream.SampleRate = 96000;
                break;

            case 5:
                stream.SampleRate = 192000;
                break;

            default:
                stream.SampleRate = 0;
                break;
            }

            stream.BitRate = (uint)
                             (stream.SampleRate * stream.BitDepth *
                              (stream.ChannelCount + stream.LFE));

            stream.IsVBR         = false;
            stream.IsInitialized = true;
        }
コード例 #6
0
ファイル: TSCodecDTSHD.cs プロジェクト: wegel/BDInfo.Core
        public void Scan(TSAudioStream stream, TSStreamBuffer buffer, ref string tag, long?bitrate)
        {
            if (stream.IsInitialized &&
                (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO || stream.CoreStream != null && stream.CoreStream.IsInitialized))
            {
                return;
            }

            var  syncFound = false;
            uint sync      = 0;

            for (var i = 0; i < buffer.Length; i++)
            {
                sync = (sync << 8) + buffer.ReadByte();
                if (sync == 0x64582025)
                {
                    syncFound = true;
                    break;
                }
            }

            if (!syncFound)
            {
                tag = "CORE";
                if (stream.CoreStream == null)
                {
                    stream.CoreStream = new TSAudioStream {
                        StreamType = TSStreamType.DTS_AUDIO
                    }
                }
                ;
                if (!stream.CoreStream.IsInitialized)
                {
                    buffer.BeginRead();
                    (new TSCodecDTS()).Scan(stream.CoreStream, buffer, ref tag, bitrate);
                }

                return;
            }

            tag = "HD";
            buffer.BSSkipBits(8);
            var nuSubStreamIndex = buffer.ReadBits4(2);
            var bBlownUpHeader   = buffer.ReadBool();

            buffer.BSSkipBits(bBlownUpHeader ? 32 : 24);

            var nuNumAssets          = 1;
            var bStaticFieldsPresent = buffer.ReadBool();

            if (bStaticFieldsPresent)
            {
                buffer.BSSkipBits(5);

                if (buffer.ReadBool())
                {
                    buffer.BSSkipBits(36);
                }
                var nuNumAudioPresent = buffer.ReadBits2(3) + 1;
                nuNumAssets = buffer.ReadBits2(3) + 1;
                var nuActiveExSsMask = new uint[nuNumAudioPresent];
                for (var i = 0; i < nuNumAudioPresent; i++)
                {
                    nuActiveExSsMask[i] = buffer.ReadBits4((int)(nuSubStreamIndex + 1));                                          //?
                }
                for (var i = 0; i < nuNumAudioPresent; i++)
                {
                    for (var j = 0; j < nuSubStreamIndex + 1; j++)
                    {
                        if ((j + 1) % 2 == 1)
                        {
                            buffer.BSSkipBits(8);
                        }
                    }
                }
                if (buffer.ReadBool())
                {
                    buffer.BSSkipBits(2);
                    var nuBits4MixOutMask  = buffer.ReadBits2(2) * 4 + 4;
                    var nuNumMixOutConfigs = buffer.ReadBits2(2) + 1;
                    var nuMixOutChMask     = new uint[nuNumMixOutConfigs];
                    for (var i = 0; i < nuNumMixOutConfigs; i++)
                    {
                        nuMixOutChMask[i] = buffer.ReadBits4(nuBits4MixOutMask);
                    }
                }
            }

            var assetSizes = new uint[nuNumAssets];

            for (var i = 0; i < nuNumAssets; i++)
            {
                if (bBlownUpHeader)
                {
                    assetSizes[i] = buffer.ReadBits4(20) + 1;
                }
                else
                {
                    assetSizes[i] = buffer.ReadBits4(16) + 1;
                }
            }
            for (var i = 0; i < nuNumAssets; i++)
            {
                buffer.BSSkipBits(12);
                if (bStaticFieldsPresent)
                {
                    if (buffer.ReadBool())
                    {
                        buffer.BSSkipBits(4);
                    }
                    if (buffer.ReadBool())
                    {
                        buffer.BSSkipBits(24);
                    }
                    if (buffer.ReadBool())
                    {
                        var nuInfoTextByteSize = buffer.ReadBits2(10) + 1;
                        var infoText           = new ushort[nuInfoTextByteSize];
                        for (var j = 0; j < nuInfoTextByteSize; j++)
                        {
                            infoText[j] = buffer.ReadBits2(8);
                        }
                    }

                    var  nuBitResolution    = buffer.ReadBits2(5) + 1;
                    int  nuMaxSampleRate    = buffer.ReadBits2(4);
                    var  nuTotalNumChs      = buffer.ReadBits2(8) + 1;
                    uint nuSpkrActivityMask = 0;
                    if (buffer.ReadBool())
                    {
                        if (nuTotalNumChs > 2)
                        {
                            buffer.BSSkipBits(1);
                        }
                        if (nuTotalNumChs > 6)
                        {
                            buffer.BSSkipBits(1);
                        }
                        if (buffer.ReadBool())
                        {
                            int nuNumBits4SAMask = buffer.ReadBits2(2);
                            nuNumBits4SAMask   = nuNumBits4SAMask * 4 + 4;
                            nuSpkrActivityMask = buffer.ReadBits4(nuNumBits4SAMask);
                        }

                        // TODO...
                    }

                    stream.SampleRate = SampleRates[nuMaxSampleRate];
                    stream.BitDepth   = nuBitResolution;

                    stream.LFE = 0;
                    if ((nuSpkrActivityMask & 0x8) == 0x8)
                    {
                        ++stream.LFE;
                    }
                    if ((nuSpkrActivityMask & 0x1000) == 0x1000)
                    {
                        ++stream.LFE;
                    }
                    stream.ChannelCount = nuTotalNumChs - stream.LFE;
                }

                if (nuNumAssets > 1)
                {
                    // TODO...
                    break;
                }
            }

            uint temp2 = 0;

            while (buffer.Position < buffer.Length)
            {
                temp2 = (temp2 << 8) + buffer.ReadByte();
                switch (temp2)
                {
                case 0x41A29547:     // XLL Extended data
                case 0x655E315E:     // XBR Extended data
                case 0x0A801921:     // XSA Extended data
                case 0x1D95F262:     // X96k
                case 0x47004A03:     // XXch
                case 0x5A5A5A5A:     // Xch
                    var temp3 = 0;
                    for (var i = (int)buffer.Position; i < buffer.Length; i++)
                    {
                        temp3 = (temp3 << 8) + buffer.ReadByte();

                        if (temp3 == 0x02000850)     //DTS:X Pattern
                        {
                            stream.HasExtensions = true;
                            break;
                        }
                    }

                    break;
                }

                if (stream.HasExtensions)
                {
                    break;
                }
            }

            // TODO
            if (stream.CoreStream != null)
            {
                var coreStream = stream.CoreStream;
                if (coreStream.AudioMode == TSAudioMode.Extended && stream.ChannelCount == 5)
                {
                    stream.AudioMode = TSAudioMode.Extended;
                }

                /*
                 * if (coreStream.DialNorm != 0)
                 * {
                 *  stream.DialNorm = coreStream.DialNorm;
                 * }
                 */
            }

            if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO)
            {
                stream.IsVBR         = true;
                stream.IsInitialized = true;
            }
            else if (bitrate.HasValue && bitrate > 0)
            {
                stream.IsVBR   = false;
                stream.BitRate = bitrate.Value;
                if (stream.CoreStream != null)
                {
                    stream.BitRate      += stream.CoreStream.BitRate;
                    stream.IsInitialized = true;
                }

                stream.IsInitialized = stream.BitRate > 0;
            }
        }
    }
コード例 #7
0
ファイル: TSCodecDTSHD.cs プロジェクト: xiahuaijia/BDInfo-1
        public static void Scan(
            TSAudioStream stream,
            TSStreamBuffer buffer,
            long bitrate,
            ref string tag)
        {
            if (stream.IsInitialized &&
                (stream.StreamType == TSStreamType.DTS_HD_SECONDARY_AUDIO ||
                 (stream.CoreStream != null &&
                  stream.CoreStream.IsInitialized)))
            {
                return;
            }

            bool syncFound = false;
            uint sync      = 0;

            for (int i = 0; i < buffer.Length; i++)
            {
                sync = (sync << 8) + buffer.ReadByte();
                if (sync == 0x64582025)
                {
                    syncFound = true;
                    break;
                }
            }

            if (!syncFound)
            {
                tag = "CORE";
                if (stream.CoreStream == null)
                {
                    stream.CoreStream            = new TSAudioStream();
                    stream.CoreStream.StreamType = TSStreamType.DTS_AUDIO;
                }
                if (!stream.CoreStream.IsInitialized)
                {
                    buffer.BeginRead();
                    TSCodecDTS.Scan(stream.CoreStream, buffer, bitrate, ref tag);
                }
                return;
            }

            tag = "HD";
            int temp1             = buffer.ReadBits(8);
            int nuSubStreamIndex  = buffer.ReadBits(2);
            int nuExtSSHeaderSize = 0;
            int nuExtSSFSize      = 0;
            int bBlownUpHeader    = buffer.ReadBits(1);

            if (1 == bBlownUpHeader)
            {
                nuExtSSHeaderSize = buffer.ReadBits(12) + 1;
                nuExtSSFSize      = buffer.ReadBits(20) + 1;
            }
            else
            {
                nuExtSSHeaderSize = buffer.ReadBits(8) + 1;
                nuExtSSFSize      = buffer.ReadBits(16) + 1;
            }
            int nuNumAudioPresent    = 1;
            int nuNumAssets          = 1;
            int bStaticFieldsPresent = buffer.ReadBits(1);

            if (1 == bStaticFieldsPresent)
            {
                int  nuRefClockCode          = buffer.ReadBits(2);
                int  nuExSSFrameDurationCode = buffer.ReadBits(3) + 1;
                long nuTimeStamp             = 0;
                if (1 == buffer.ReadBits(1))
                {
                    nuTimeStamp = (buffer.ReadBits(18) << 18) + buffer.ReadBits(18);
                }
                nuNumAudioPresent = buffer.ReadBits(3) + 1;
                nuNumAssets       = buffer.ReadBits(3) + 1;
                int[] nuActiveExSSMask = new int[nuNumAudioPresent];
                for (int i = 0; i < nuNumAudioPresent; i++)
                {
                    nuActiveExSSMask[i] = buffer.ReadBits(nuSubStreamIndex + 1); //?
                }
                for (int i = 0; i < nuNumAudioPresent; i++)
                {
                    for (int j = 0; j < nuSubStreamIndex + 1; j++)
                    {
                        if (((j + 1) % 2) == 1)
                        {
                            int mask = buffer.ReadBits(8);
                        }
                    }
                }
                if (1 == buffer.ReadBits(1))
                {
                    int   nuMixMetadataAdjLevel = buffer.ReadBits(2);
                    int   nuBits4MixOutMask     = buffer.ReadBits(2) * 4 + 4;
                    int   nuNumMixOutConfigs    = buffer.ReadBits(2) + 1;
                    int[] nuMixOutChMask        = new int[nuNumMixOutConfigs];
                    for (int i = 0; i < nuNumMixOutConfigs; i++)
                    {
                        nuMixOutChMask[i] = buffer.ReadBits(nuBits4MixOutMask);
                    }
                }
            }
            int[] AssetSizes = new int[nuNumAssets];
            for (int i = 0; i < nuNumAssets; i++)
            {
                if (1 == bBlownUpHeader)
                {
                    AssetSizes[i] = buffer.ReadBits(20) + 1;
                }
                else
                {
                    AssetSizes[i] = buffer.ReadBits(16) + 1;
                }
            }
            for (int i = 0; i < nuNumAssets; i++)
            {
                long bufferPosition              = buffer.Position;
                int  nuAssetDescriptorFSIZE      = buffer.ReadBits(9) + 1;
                int  DescriptorDataForAssetIndex = buffer.ReadBits(3);
                if (1 == bStaticFieldsPresent)
                {
                    int AssetTypeDescrPresent = buffer.ReadBits(1);
                    if (1 == AssetTypeDescrPresent)
                    {
                        int AssetTypeDescriptor = buffer.ReadBits(4);
                    }
                    int LanguageDescrPresent = buffer.ReadBits(1);
                    if (1 == LanguageDescrPresent)
                    {
                        int LanguageDescriptor = buffer.ReadBits(24);
                    }
                    int bInfoTextPresent = buffer.ReadBits(1);
                    if (1 == bInfoTextPresent)
                    {
                        int   nuInfoTextByteSize = buffer.ReadBits(10) + 1;
                        int[] InfoText           = new int[nuInfoTextByteSize];
                        for (int j = 0; j < nuInfoTextByteSize; j++)
                        {
                            InfoText[j] = buffer.ReadBits(8);
                        }
                    }
                    int nuBitResolution = buffer.ReadBits(5) + 1;
                    int nuMaxSampleRate = buffer.ReadBits(4);
                    int nuTotalNumChs   = buffer.ReadBits(8) + 1;
                    int bOne2OneMapChannels2Speakers = buffer.ReadBits(1);
                    int nuSpkrActivityMask           = 0;
                    if (1 == bOne2OneMapChannels2Speakers)
                    {
                        int bEmbeddedStereoFlag = 0;
                        if (nuTotalNumChs > 2)
                        {
                            bEmbeddedStereoFlag = buffer.ReadBits(1);
                        }
                        int bEmbeddedSixChFlag = 0;
                        if (nuTotalNumChs > 6)
                        {
                            bEmbeddedSixChFlag = buffer.ReadBits(1);
                        }
                        int bSpkrMaskEnabled = buffer.ReadBits(1);
                        int nuNumBits4SAMask = 0;
                        if (1 == bSpkrMaskEnabled)
                        {
                            nuNumBits4SAMask   = buffer.ReadBits(2);
                            nuNumBits4SAMask   = nuNumBits4SAMask * 4 + 4;
                            nuSpkrActivityMask = buffer.ReadBits(nuNumBits4SAMask);
                        }
                        // TODO...
                    }
                    stream.SampleRate = SampleRates[nuMaxSampleRate];
                    stream.BitDepth   = nuBitResolution;

                    stream.LFE = 0;
                    if ((nuSpkrActivityMask & 0x8) == 0x8)
                    {
                        ++stream.LFE;
                    }
                    if ((nuSpkrActivityMask & 0x1000) == 0x1000)
                    {
                        ++stream.LFE;
                    }
                    stream.ChannelCount = nuTotalNumChs - stream.LFE;
                }
                if (nuNumAssets > 1)
                {
                    // TODO...
                    break;
                }
            }

            // TODO
            if (stream.CoreStream != null)
            {
                TSAudioStream coreStream = (TSAudioStream)stream.CoreStream;
                if (coreStream.AudioMode == TSAudioMode.Extended &&
                    stream.ChannelCount == 5)
                {
                    stream.AudioMode = TSAudioMode.Extended;
                }

                /*
                 * if (coreStream.DialNorm != 0)
                 * {
                 *  stream.DialNorm = coreStream.DialNorm;
                 * }
                 */
            }

            if (stream.StreamType == TSStreamType.DTS_HD_MASTER_AUDIO)
            {
                stream.IsVBR         = true;
                stream.IsInitialized = true;
            }
            else if (bitrate > 0)
            {
                stream.IsVBR   = false;
                stream.BitRate = bitrate;
                if (stream.CoreStream != null)
                {
                    stream.BitRate      += stream.CoreStream.BitRate;
                    stream.IsInitialized = true;
                }
                stream.IsInitialized = (stream.BitRate > 0 ? true : false);
            }
        }
コード例 #8
0
ファイル: TSCodecTrueHD.cs プロジェクト: zxz2020/jellyfin
        public static void Scan(
            TSAudioStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            if (stream.IsInitialized &&
                stream.CoreStream != null &&
                stream.CoreStream.IsInitialized)
            {
                return;
            }

            bool syncFound = false;
            uint sync      = 0;

            for (int i = 0; i < buffer.Length; i++)
            {
                sync = (sync << 8) + buffer.ReadByte();
                if (sync == 0xF8726FBA)
                {
                    syncFound = true;
                    break;
                }
            }

            if (!syncFound)
            {
                tag = "CORE";
                if (stream.CoreStream == null)
                {
                    stream.CoreStream            = new TSAudioStream();
                    stream.CoreStream.StreamType = TSStreamType.AC3_AUDIO;
                }
                if (!stream.CoreStream.IsInitialized)
                {
                    buffer.BeginRead();
                    TSCodecAC3.Scan(stream.CoreStream, buffer, ref tag);
                }
                return;
            }

            tag = "HD";
            int ratebits = buffer.ReadBits(4);

            if (ratebits != 0xF)
            {
                stream.SampleRate =
                    (((ratebits & 8) > 0 ? 44100 : 48000) << (ratebits & 7));
            }
            int temp1 = buffer.ReadBits(8);
            int channels_thd_stream1 = buffer.ReadBits(5);
            int temp2 = buffer.ReadBits(2);

            stream.ChannelCount = 0;
            stream.LFE          = 0;
            int c_LFE2 = buffer.ReadBits(1);

            if (c_LFE2 == 1)
            {
                stream.LFE += 1;
            }
            int c_Cvh = buffer.ReadBits(1);

            if (c_Cvh == 1)
            {
                stream.ChannelCount += 1;
            }
            int c_LRw = buffer.ReadBits(1);

            if (c_LRw == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LRsd = buffer.ReadBits(1);

            if (c_LRsd == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_Ts = buffer.ReadBits(1);

            if (c_Ts == 1)
            {
                stream.ChannelCount += 1;
            }
            int c_Cs = buffer.ReadBits(1);

            if (c_Cs == 1)
            {
                stream.ChannelCount += 1;
            }
            int c_LRrs = buffer.ReadBits(1);

            if (c_LRrs == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LRc = buffer.ReadBits(1);

            if (c_LRc == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LRvh = buffer.ReadBits(1);

            if (c_LRvh == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LRs = buffer.ReadBits(1);

            if (c_LRs == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LFE = buffer.ReadBits(1);

            if (c_LFE == 1)
            {
                stream.LFE += 1;
            }
            int c_C = buffer.ReadBits(1);

            if (c_C == 1)
            {
                stream.ChannelCount += 1;
            }
            int c_LR = buffer.ReadBits(1);

            if (c_LR == 1)
            {
                stream.ChannelCount += 2;
            }

            int access_unit_size      = 40 << (ratebits & 7);
            int access_unit_size_pow2 = 64 << (ratebits & 7);

            int a1 = buffer.ReadBits(16);
            int a2 = buffer.ReadBits(16);
            int a3 = buffer.ReadBits(16);

            int is_vbr       = buffer.ReadBits(1);
            int peak_bitrate = buffer.ReadBits(15);

            peak_bitrate = (peak_bitrate * stream.SampleRate) >> 4;

            double peak_bitdepth =
                (double)peak_bitrate /
                (stream.ChannelCount + stream.LFE) /
                stream.SampleRate;

            if (peak_bitdepth > 14)
            {
                stream.BitDepth = 24;
            }
            else
            {
                stream.BitDepth = 16;
            }

#if DEBUG
            System.Diagnostics.Debug.WriteLine(string.Format(
                                                   "{0}\t{1}\t{2:F2}",
                                                   stream.PID, peak_bitrate, peak_bitdepth));
#endif

            /*
             * // TODO: Get THD dialnorm from metadata
             * if (stream.CoreStream != null)
             * {
             *  TSAudioStream coreStream = (TSAudioStream)stream.CoreStream;
             *  if (coreStream.DialNorm != 0)
             *  {
             *      stream.DialNorm = coreStream.DialNorm;
             *  }
             * }
             */

            stream.IsVBR         = true;
            stream.IsInitialized = true;
        }
コード例 #9
0
ファイル: TSCodecLPCM.cs プロジェクト: hurda/BDInfo
        public static void Scan(
            TSAudioStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            if (stream.IsInitialized) return;

            byte[] header = buffer.ReadBytes(4);
            int flags = (header[2] << 8) + header[3];

            switch ((flags & 0xF000) >> 12)
            {
                case 1: // 1/0/0
                    stream.ChannelCount = 1;
                    stream.LFE = 0;
                    break;
                case 3: // 2/0/0
                    stream.ChannelCount = 2;
                    stream.LFE = 0;
                    break;
                case 4: // 3/0/0
                    stream.ChannelCount = 3;
                    stream.LFE = 0;
                    break;
                case 5: // 2/1/0
                    stream.ChannelCount = 3;
                    stream.LFE = 0;
                    break;
                case 6: // 3/1/0
                    stream.ChannelCount = 4;
                    stream.LFE = 0;
                    break;
                case 7: // 2/2/0
                    stream.ChannelCount = 4;
                    stream.LFE = 0;
                    break;
                case 8: // 3/2/0
                    stream.ChannelCount = 5;
                    stream.LFE = 0;
                    break;
                case 9: // 3/2/1
                    stream.ChannelCount = 5;
                    stream.LFE = 1;
                    break;
                case 10: // 3/4/0
                    stream.ChannelCount = 7;
                    stream.LFE = 0;
                    break;
                case 11: // 3/4/1
                    stream.ChannelCount = 7;
                    stream.LFE = 1;
                    break;
                default:
                    stream.ChannelCount = 0;
                    stream.LFE = 0;
                    break;
            }

            switch ((flags & 0xC0) >> 6)
            {
                case 1:
                    stream.BitDepth = 16;
                    break;
                case 2:
                    stream.BitDepth = 20;
                    break;
                case 3:
                    stream.BitDepth = 24;
                    break;
                default:
                    stream.BitDepth = 0;
                    break;
            }

            switch ((flags & 0xF00) >> 8)
            {
                case 1:
                    stream.SampleRate = 48000;
                    break;
                case 4:
                    stream.SampleRate = 96000;
                    break;
                case 5:
                    stream.SampleRate = 192000;
                    break;
                default:
                    stream.SampleRate = 0;
                    break;
            }

            stream.BitRate = (uint)
                (stream.SampleRate * stream.BitDepth *
                 (stream.ChannelCount + stream.LFE));

            stream.IsVBR = false;
            stream.IsInitialized = true;
        }
コード例 #10
0
ファイル: TSCodecTrueHD.cs プロジェクト: JGTM2016/bdhero
        public static void Scan(
            TSAudioStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            if (stream.IsInitialized &&
                stream.CoreStream != null &&
                stream.CoreStream.IsInitialized) return;

            bool syncFound = false;
            uint sync = 0;
            for (int i = 0; i < buffer.Length; i++)
            {
                sync = (sync << 8) + buffer.ReadByte();
                if (sync == 0xF8726FBA) 
                {
                    syncFound = true;
                    break;
                }
            }

            if (!syncFound)
            {
                tag = "CORE";
                if (stream.CoreStream == null)
                {
                    stream.CoreStream = new TSAudioStream();
                    stream.CoreStream.StreamType = TSStreamType.AC3_AUDIO;
                }
                if (!stream.CoreStream.IsInitialized)
                {
                    buffer.BeginRead();
                    TSCodecAC3.Scan(stream.CoreStream, buffer, ref tag);
                }
                return;
            }

            tag = "HD";
            int ratebits = buffer.ReadBits(4);
            if (ratebits != 0xF)
            {
                stream.SampleRate = 
                    (((ratebits & 8) > 0 ? 44100 : 48000) << (ratebits & 7));
            }
            int temp1 = buffer.ReadBits(8);
            int channels_thd_stream1 = buffer.ReadBits(5);
            int temp2 = buffer.ReadBits(2);

            stream.ChannelCount = 0;
            stream.LFE = 0;
            int c_LFE2 = buffer.ReadBits(1);
            if (c_LFE2 == 1)
            {
                stream.LFE += 1;
            }
            int c_Cvh = buffer.ReadBits(1);
            if (c_Cvh == 1)
            {
                stream.ChannelCount += 1;
            }
            int c_LRw = buffer.ReadBits(1);
            if (c_LRw == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LRsd = buffer.ReadBits(1);
            if (c_LRsd == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_Ts = buffer.ReadBits(1);
            if (c_Ts == 1)
            {
                stream.ChannelCount += 1;
            }
            int c_Cs = buffer.ReadBits(1);
            if (c_Cs == 1)
            {
                stream.ChannelCount += 1;
            }
            int c_LRrs = buffer.ReadBits(1);
            if (c_LRrs == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LRc = buffer.ReadBits(1);
            if (c_LRc == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LRvh = buffer.ReadBits(1);
            if (c_LRvh == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LRs = buffer.ReadBits(1);
            if (c_LRs == 1)
            {
                stream.ChannelCount += 2;
            }
            int c_LFE = buffer.ReadBits(1);
            if (c_LFE == 1)
            {
                stream.LFE += 1;
            }
            int c_C = buffer.ReadBits(1);
            if (c_C == 1)
            {
                stream.ChannelCount += 1;
            }
            int c_LR = buffer.ReadBits(1);
            if (c_LR == 1)
            {
                stream.ChannelCount += 2;
            }

            int access_unit_size = 40 << (ratebits & 7);
            int access_unit_size_pow2 = 64 << (ratebits & 7);

            int a1 = buffer.ReadBits(16);
            int a2 = buffer.ReadBits(16);
            int a3 = buffer.ReadBits(16);

            int is_vbr = buffer.ReadBits(1);
            int peak_bitrate = buffer.ReadBits(15);
            peak_bitrate = (peak_bitrate * stream.SampleRate) >> 4;

            double peak_bitdepth = 
                (double)peak_bitrate / 
                (stream.ChannelCount + stream.LFE) / 
                stream.SampleRate;
            if (peak_bitdepth > 14)
            {
                stream.BitDepth = 24;
            }
            else
            {
                stream.BitDepth = 16;
            }

#if DEBUG
            System.Diagnostics.Debug.WriteLine(string.Format(
                "{0}\t{1}\t{2:F2}", 
                stream.PID, peak_bitrate, peak_bitdepth));
#endif
            /*
            // TODO: Get THD dialnorm from metadata
            if (stream.CoreStream != null)
            {
                TSAudioStream coreStream = (TSAudioStream)stream.CoreStream;
                if (coreStream.DialNorm != 0)
                {
                    stream.DialNorm = coreStream.DialNorm;
                }
            }
            */

            stream.IsVBR = true;
            stream.IsInitialized = true;
        }
コード例 #11
0
ファイル: TSCodecDTS.cs プロジェクト: hurda/BDInfo
        public static void Scan(
            TSAudioStream stream,
            TSStreamBuffer buffer,
            long bitrate,
            ref string tag)
        {
            if (stream.IsInitialized) return;

            bool syncFound = false;
            uint sync = 0;
            for (int i = 0; i < buffer.Length; i++)
            {
                sync = (sync << 8) + buffer.ReadByte();
                if (sync == 0x7FFE8001)
                {
                    syncFound = true;
                    break;
                }
            }
            if (!syncFound) return;

            int frame_type = buffer.ReadBits(1);
            int samples_deficit = buffer.ReadBits(5);
            int crc_present = buffer.ReadBits(1);
            int sample_blocks = buffer.ReadBits(7);
            int frame_size = buffer.ReadBits(14);
            if (frame_size < 95)
            {
                return;
            }
            int amode = buffer.ReadBits(6);
            int sample_rate = buffer.ReadBits(4);
            if (sample_rate < 0 || sample_rate >= dca_sample_rates.Length)
            {
                return;
            }
            int bit_rate = buffer.ReadBits(5);
            if (bit_rate < 0 || bit_rate >= dca_bit_rates.Length)
            {
                return;
            }
            int downmix = buffer.ReadBits(1);
            int dynrange = buffer.ReadBits(1);
            int timestamp = buffer.ReadBits(1);
            int aux_data = buffer.ReadBits(1);
            int hdcd = buffer.ReadBits(1);
            int ext_descr = buffer.ReadBits(3);
            int ext_coding = buffer.ReadBits(1);
            int aspf = buffer.ReadBits(1);
            int lfe = buffer.ReadBits(2);
            int predictor_history = buffer.ReadBits(1);
            if (crc_present == 1)
            {
                int crc = buffer.ReadBits(16);
            }
            int multirate_inter = buffer.ReadBits(1);
            int version = buffer.ReadBits(4);
            int copy_history = buffer.ReadBits(2);
            int source_pcm_res = buffer.ReadBits(3);
            int front_sum = buffer.ReadBits(1);
            int surround_sum = buffer.ReadBits(1);
            int dialog_norm = buffer.ReadBits(4);
            if (source_pcm_res < 0 || source_pcm_res >= dca_bits_per_sample.Length)
            {
                return;
            }
            int subframes = buffer.ReadBits(4);
            int total_channels = buffer.ReadBits(3) + 1 + ext_coding;

            stream.SampleRate = dca_sample_rates[sample_rate];
            stream.ChannelCount = total_channels;
            stream.LFE = (lfe > 0 ? 1 : 0);
            stream.BitDepth = dca_bits_per_sample[source_pcm_res];
            stream.DialNorm = -dialog_norm;
            if ((source_pcm_res & 0x1) == 0x1)
            {
                stream.AudioMode = TSAudioMode.Extended;
            }

            stream.BitRate = (uint)dca_bit_rates[bit_rate];
            switch (stream.BitRate)
            {
                case 1:
                    if (bitrate > 0)
                    {
                        stream.BitRate = bitrate;
                        stream.IsVBR = false;
                        stream.IsInitialized = true;
                    }
                    else
                    {
                        stream.BitRate = 0;
                    }
                    break;

                case 2:
                case 3:
                    stream.IsVBR = true;
                    stream.IsInitialized = true;
                    break;

                default:
                    stream.IsVBR = false;
                    stream.IsInitialized = true;
                    break;
            }
        }
コード例 #12
0
ファイル: TSCodecDTS.cs プロジェクト: wegel/BDInfo.Core
        public void Scan(TSAudioStream stream, TSStreamBuffer buffer, ref string tag, long?bitrate)
        {
            if (stream.IsInitialized)
            {
                return;
            }

            var  syncFound = false;
            uint sync      = 0;

            for (var i = 0; i < buffer.Length; i++)
            {
                sync = (sync << 8) + buffer.ReadByte();
                if (sync == 0x7FFE8001)
                {
                    syncFound = true;
                    break;
                }
            }

            if (!syncFound)
            {
                return;
            }

            buffer.BSSkipBits(6);
            var crcPresent = buffer.ReadBits4(1);

            buffer.BSSkipBits(7);
            var frameSize = buffer.ReadBits4(14);

            if (frameSize < 95)
            {
                return;
            }
            buffer.BSSkipBits(6);
            var sampleRate = buffer.ReadBits4(4);

            if (sampleRate >= DcaSampleRates.Length)
            {
                return;
            }
            var bitRate = buffer.ReadBits4(5);

            if (bitRate >= DcaBitRates.Length)
            {
                return;
            }
            buffer.BSSkipBits(8);
            var extCoding = buffer.ReadBits4(1);

            buffer.BSSkipBits(1);
            var lfe = buffer.ReadBits4(2);

            buffer.BSSkipBits(1);
            if (crcPresent == 1)
            {
                buffer.BSSkipBits(16);
            }
            buffer.BSSkipBits(7);
            var sourcePcmRes = buffer.ReadBits4(3);

            buffer.BSSkipBits(2);
            var dialogNorm = buffer.ReadBits4(4);

            if (sourcePcmRes >= DcaBitsPerSample.Length)
            {
                return;
            }
            buffer.BSSkipBits(4);
            var totalChannels = buffer.ReadBits4(3) + 1 + extCoding;

            stream.SampleRate   = DcaSampleRates[sampleRate];
            stream.ChannelCount = (int)totalChannels;
            stream.LFE          = lfe > 0 ? 1 : 0;
            stream.BitDepth     = DcaBitsPerSample[sourcePcmRes];
            stream.DialNorm     = (int)-dialogNorm;
            if ((sourcePcmRes & 0x1) == 0x1)
            {
                stream.AudioMode = TSAudioMode.Extended;
            }

            stream.BitRate = (uint)DcaBitRates[bitRate];
            switch (stream.BitRate)
            {
            case 1:
                if (bitrate != null && bitrate > 0)
                {
                    stream.BitRate       = bitrate.Value;
                    stream.IsVBR         = false;
                    stream.IsInitialized = true;
                }
                else
                {
                    stream.BitRate = 0;
                }

                break;

            case 2:
            case 3:
                stream.IsVBR         = true;
                stream.IsInitialized = true;
                break;

            default:
                stream.IsVBR         = false;
                stream.IsInitialized = true;
                break;
            }
        }