Esempio n. 1
0
        public static void Scan(
            TSVideoStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            uint   parse = 0;
            byte   accessUnitDelimiterParse  = 0;
            byte   sequenceParameterSetParse = 0;
            string profile            = null;
            string level              = null;
            byte   constraintSet0Flag = 0;
            byte   constraintSet1Flag = 0;
            byte   constraintSet2Flag = 0;
            byte   constraintSet3Flag = 0;

            for (int i = 0; i < buffer.Length; i++)
            {
                parse = (parse << 8) + buffer.ReadByte();

                if (parse == 0x00000109)
                {
                    accessUnitDelimiterParse = 1;
                }
                else if (accessUnitDelimiterParse > 0)
                {
                    --accessUnitDelimiterParse;
                    if (accessUnitDelimiterParse == 0)
                    {
                        switch ((parse & 0xFF) >> 5)
                        {
                        case 0:     // I
                        case 3:     // SI
                        case 5:     // I, SI
                            tag = "I";
                            break;

                        case 1:     // I, P
                        case 4:     // SI, SP
                        case 6:     // I, SI, P, SP
                            tag = "P";
                            break;

                        case 2:     // I, P, B
                        case 7:     // I, SI, P, SP, B
                            tag = "B";
                            break;
                        }
                        if (stream.IsInitialized)
                        {
                            return;
                        }
                    }
                }
                else if (parse == 0x00000127 || parse == 0x00000167)
                {
                    sequenceParameterSetParse = 3;
                }
                else if (sequenceParameterSetParse > 0)
                {
                    --sequenceParameterSetParse;
                    switch (sequenceParameterSetParse)
                    {
                    case 2:
                        switch (parse & 0xFF)
                        {
                        case 66:
                            profile = "Baseline Profile";
                            break;

                        case 77:
                            profile = "Main Profile";
                            break;

                        case 88:
                            profile = "Extended Profile";
                            break;

                        case 100:
                            profile = "High Profile";
                            break;

                        case 110:
                            profile = "High 10 Profile";
                            break;

                        case 122:
                            profile = "High 4:2:2 Profile";
                            break;

                        case 144:
                            profile = "High 4:4:4 Profile";
                            break;

                        default:
                            profile = "Unknown Profile";
                            break;
                        }
                        break;

                    case 1:
                        constraintSet0Flag = (byte)
                                             ((parse & 0x80) >> 7);
                        constraintSet1Flag = (byte)
                                             ((parse & 0x40) >> 6);
                        constraintSet2Flag = (byte)
                                             ((parse & 0x20) >> 5);
                        constraintSet3Flag = (byte)
                                             ((parse & 0x10) >> 4);
                        break;

                    case 0:
                        byte b = (byte)(parse & 0xFF);
                        if (b == 11 && constraintSet3Flag == 1)
                        {
                            level = "1b";
                        }
                        else
                        {
                            level = string.Format(
                                "{0:D}.{1:D}",
                                b / 10, (b - ((b / 10) * 10)));
                        }
                        stream.EncodingProfile = string.Format(
                            "{0} {1}", profile, level);
                        stream.IsVBR         = true;
                        stream.IsInitialized = true;
                        break;
                    }
                }
            }
            return;
        }
Esempio n. 2
0
        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);
            }            
        }
Esempio n. 3
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;
            }
        }
Esempio n. 4
0
        public static void Scan(
            TSVideoStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            int  parse               = 0;
            byte frameHeaderParse    = 0;
            byte sequenceHeaderParse = 0;
            bool isInterlaced        = false;

            for (int i = 0; i < buffer.Length; i++)
            {
                parse = (parse << 8) + buffer.ReadByte();

                if (parse == 0x0000010D)
                {
                    frameHeaderParse = 4;
                }
                else if (frameHeaderParse > 0)
                {
                    --frameHeaderParse;
                    if (frameHeaderParse == 0)
                    {
                        uint pictureType = 0;
                        if (isInterlaced)
                        {
                            if ((parse & 0x80000000) == 0)
                            {
                                pictureType =
                                    (uint)((parse & 0x78000000) >> 13);
                            }
                            else
                            {
                                pictureType =
                                    (uint)((parse & 0x3c000000) >> 12);
                            }
                        }
                        else
                        {
                            pictureType =
                                (uint)((parse & 0xf0000000) >> 14);
                        }

                        if ((pictureType & 0x20000) == 0)
                        {
                            tag = "P";
                        }
                        else if ((pictureType & 0x10000) == 0)
                        {
                            tag = "B";
                        }
                        else if ((pictureType & 0x8000) == 0)
                        {
                            tag = "I";
                        }
                        else if ((pictureType & 0x4000) == 0)
                        {
                            tag = "BI";
                        }
                        else
                        {
                            tag = null;
                        }
                        if (stream.IsInitialized)
                        {
                            return;
                        }
                    }
                }
                else if (parse == 0x0000010F)
                {
                    sequenceHeaderParse = 6;
                }
                else if (sequenceHeaderParse > 0)
                {
                    --sequenceHeaderParse;
                    switch (sequenceHeaderParse)
                    {
                    case 5:
                        int profileLevel = ((parse & 0x38) >> 3);
                        if (((parse & 0xC0) >> 6) == 3)
                        {
                            stream.EncodingProfile = string.Format(
                                "Advanced Profile {0}", profileLevel);
                        }
                        else
                        {
                            stream.EncodingProfile = string.Format(
                                "Main Profile {0}", profileLevel);
                        }
                        break;

                    case 0:
                        if (((parse & 0x40) >> 6) > 0)
                        {
                            isInterlaced = true;
                        }
                        else
                        {
                            isInterlaced = false;
                        }
                        break;
                    }
                    stream.IsVBR         = true;
                    stream.IsInitialized = true;
                }
            }
        }
Esempio n. 5
0
        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;
            }
        }
    }
Esempio n. 6
0
        public static void Scan(
            TSVideoStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            int parse = 0;
            int pictureParse = 0;
            int sequenceHeaderParse = 0;
            int extensionParse = 0;
            int sequenceExtensionParse = 0;            

            for (int i = 0; i < buffer.Length; i++)
            {
                parse = (parse << 8) + buffer.ReadByte();

                if (parse == 0x00000100)
                {
                    pictureParse = 2;
                }
                else if (parse == 0x000001B3)
                {
                    sequenceHeaderParse = 7;
                }
                else if (sequenceHeaderParse > 0)
                {
                    --sequenceHeaderParse;
                    switch (sequenceHeaderParse)
                    {
#if DEBUG
                        case 6:
                            break;

                        case 5:
                            break;

                        case 4:
                            stream.Width =
                                (int)((parse & 0xFFF000) >> 12);
                            stream.Height =
                                (int)(parse & 0xFFF);
                            break;

                        case 3:
                            stream.AspectRatio =
                                (TSAspectRatio)((parse & 0xF0) >> 4);

                            switch ((parse & 0xF0) >> 4)
                            {
                                case 0: // Forbidden
                                    break;
                                case 1: // Square
                                    break;
                                case 2: // 4:3
                                    break;
                                case 3: // 16:9
                                    break;
                                case 4: // 2.21:1
                                    break;
                                default: // Reserved
                                    break;
                            }

                            switch (parse & 0xF)
                            {
                                case 0: // Forbidden
                                    break;
                                case 1: // 23.976
                                    stream.FrameRateEnumerator = 24000;
                                    stream.FrameRateDenominator = 1001;
                                    break;
                                case 2: // 24
                                    stream.FrameRateEnumerator = 24000;
                                    stream.FrameRateDenominator = 1000;
                                    break;
                                case 3: // 25
                                    stream.FrameRateEnumerator = 25000;
                                    stream.FrameRateDenominator = 1000;
                                    break;
                                case 4: // 29.97
                                    stream.FrameRateEnumerator = 30000;
                                    stream.FrameRateDenominator = 1001;
                                    break;
                                case 5: // 30
                                    stream.FrameRateEnumerator = 30000;
                                    stream.FrameRateDenominator = 1000;
                                    break;
                                case 6: // 50
                                    stream.FrameRateEnumerator = 50000;
                                    stream.FrameRateDenominator = 1000;
                                    break;
                                case 7: // 59.94
                                    stream.FrameRateEnumerator = 60000;
                                    stream.FrameRateDenominator = 1001;
                                    break;
                                case 8: // 60
                                    stream.FrameRateEnumerator = 60000;
                                    stream.FrameRateDenominator = 1000;
                                    break;
                                default: // Reserved
                                    stream.FrameRateEnumerator = 0;
                                    stream.FrameRateDenominator = 0;
                                    break;
                            }
                            break;

                        case 2:
                            break;

                        case 1:
                            break;
#endif

                        case 0:
#if DEBUG
                            stream.BitRate =
                                (((parse & 0xFFFFC0) >> 6) * 200);
#endif
                            stream.IsVBR = true;
                            stream.IsInitialized = true;
                            break;
                    }
                }
                else if (pictureParse > 0)
                {
                    --pictureParse;
                    if (pictureParse == 0)
                    {
                        switch ((parse & 0x38) >> 3)
                        {
                            case 1:
                                tag = "I";
                                break;
                            case 2:
                                tag = "P";
                                break;
                            case 3:
                                tag = "B";
                                break;
                            default:
                                break;
                        }
                        if (stream.IsInitialized) return;
                    }
                }
                else if (parse == 0x000001B5)
                {
                    extensionParse = 1;
                }
                else if (extensionParse > 0)
                {
                    --extensionParse;
                    if (extensionParse == 0)
                    {
                        if ((parse & 0xF0) == 0x10)
                        {
                            sequenceExtensionParse = 1;
                        }
                    }
                }
                else if (sequenceExtensionParse > 0)
                {
                    --sequenceExtensionParse;
#if DEBUG
                    if (sequenceExtensionParse == 0)
                    {
                        uint sequenceExtension = 
                            ((parse & 0x8) >> 3);
                        if (sequenceExtension == 0)
                        {
                            stream.IsInterlaced = true;
                        }
                        else
                        {
                            stream.IsInterlaced = false;
                        }
                    }
#endif
                }
            }
        }
Esempio n. 7
0
        public static void Scan(
            TSVideoStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            uint parse = 0;
            byte accessUnitDelimiterParse = 0;
            byte sequenceParameterSetParse = 0;
            string profile = null;
            string level = null;
            byte constraintSet0Flag = 0;
            byte constraintSet1Flag = 0;
            byte constraintSet2Flag = 0;
            byte constraintSet3Flag = 0;

            for (int i = 0; i < buffer.Length; i++)
            {
                parse = (parse << 8) + buffer.ReadByte();

                if (parse == 0x00000109)
                {
                    accessUnitDelimiterParse = 1;
                }
                else if (accessUnitDelimiterParse > 0)
                {
                    --accessUnitDelimiterParse;
                    if (accessUnitDelimiterParse == 0)
                    {
                        switch ((parse & 0xFF) >> 5)
                        {
                            case 0: // I
                            case 3: // SI
                            case 5: // I, SI
                                tag = "I";
                                break;

                            case 1: // I, P
                            case 4: // SI, SP
                            case 6: // I, SI, P, SP
                                tag = "P";
                                break;

                            case 2: // I, P, B
                            case 7: // I, SI, P, SP, B
                                tag = "B";
                                break;
                        }
                        if (stream.IsInitialized) return;
                    }
                }
                else if (parse == 0x00000127 || parse == 0x00000167)
                {
                    sequenceParameterSetParse = 3;
                }
                else if (sequenceParameterSetParse > 0)
                {
                    --sequenceParameterSetParse;
                    switch (sequenceParameterSetParse)
                    {
                        case 2:
                            switch (parse & 0xFF)
                            {
                                case 66:
                                    profile = "Baseline Profile";
                                    break;
                                case 77:
                                    profile = "Main Profile";
                                    break;
                                case 88:
                                    profile = "Extended Profile";
                                    break;
                                case 100:
                                    profile = "High Profile";
                                    break;
                                case 110:
                                    profile = "High 10 Profile";
                                    break;
                                case 122:
                                    profile = "High 4:2:2 Profile";
                                    break;
                                case 144:
                                    profile = "High 4:4:4 Profile";
                                    break;
                                default:
                                    profile = "Unknown Profile";
                                    break;
                            }
                            break;

                        case 1:
                            constraintSet0Flag = (byte)
                                ((parse & 0x80) >> 7);
                            constraintSet1Flag = (byte)
                                ((parse & 0x40) >> 6);
                            constraintSet2Flag = (byte)
                                ((parse & 0x20) >> 5);
                            constraintSet3Flag = (byte)
                                ((parse & 0x10) >> 4);
                            break;

                        case 0:
                            byte b = (byte)(parse & 0xFF);
                            if (b == 11 && constraintSet3Flag == 1)
                            {
                                level = "1b";
                            }
                            else
                            {
                                level = string.Format(
                                    "{0:D}.{1:D}",
                                    b / 10, (b - ((b / 10) * 10)));
                            }
                            stream.EncodingProfile = string.Format(
                                "{0} {1}", profile, level);
                            stream.IsVBR = true;
                            stream.IsInitialized = true;
                            break;
                    }
                }
            }
            return;
        }
Esempio n. 8
0
        public static void Scan(
            TSVideoStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            int parse                  = 0;
            int pictureParse           = 0;
            int sequenceHeaderParse    = 0;
            int extensionParse         = 0;
            int sequenceExtensionParse = 0;

            for (int i = 0; i < buffer.Length; i++)
            {
                parse = (parse << 8) + buffer.ReadByte();

                if (parse == 0x00000100)
                {
                    pictureParse = 2;
                }
                else if (parse == 0x000001B3)
                {
                    sequenceHeaderParse = 7;
                }
                else if (sequenceHeaderParse > 0)
                {
                    --sequenceHeaderParse;
                    switch (sequenceHeaderParse)
                    {
#if DEBUG
                    case 6:
                        break;

                    case 5:
                        break;

                    case 4:
                        stream.Width =
                            (int)((parse & 0xFFF000) >> 12);
                        stream.Height =
                            (int)(parse & 0xFFF);
                        break;

                    case 3:
                        stream.AspectRatio =
                            (TSAspectRatio)((parse & 0xF0) >> 4);

                        switch ((parse & 0xF0) >> 4)
                        {
                        case 0:         // Forbidden
                            break;

                        case 1:         // Square
                            break;

                        case 2:         // 4:3
                            break;

                        case 3:         // 16:9
                            break;

                        case 4:         // 2.21:1
                            break;

                        default:         // Reserved
                            break;
                        }

                        switch (parse & 0xF)
                        {
                        case 0:         // Forbidden
                            break;

                        case 1:         // 23.976
                            stream.FrameRateEnumerator  = 24000;
                            stream.FrameRateDenominator = 1001;
                            break;

                        case 2:         // 24
                            stream.FrameRateEnumerator  = 24000;
                            stream.FrameRateDenominator = 1000;
                            break;

                        case 3:         // 25
                            stream.FrameRateEnumerator  = 25000;
                            stream.FrameRateDenominator = 1000;
                            break;

                        case 4:         // 29.97
                            stream.FrameRateEnumerator  = 30000;
                            stream.FrameRateDenominator = 1001;
                            break;

                        case 5:         // 30
                            stream.FrameRateEnumerator  = 30000;
                            stream.FrameRateDenominator = 1000;
                            break;

                        case 6:         // 50
                            stream.FrameRateEnumerator  = 50000;
                            stream.FrameRateDenominator = 1000;
                            break;

                        case 7:         // 59.94
                            stream.FrameRateEnumerator  = 60000;
                            stream.FrameRateDenominator = 1001;
                            break;

                        case 8:         // 60
                            stream.FrameRateEnumerator  = 60000;
                            stream.FrameRateDenominator = 1000;
                            break;

                        default:         // Reserved
                            stream.FrameRateEnumerator  = 0;
                            stream.FrameRateDenominator = 0;
                            break;
                        }
                        break;

                    case 2:
                        break;

                    case 1:
                        break;
#endif

                    case 0:
#if DEBUG
                        stream.BitRate =
                            (((parse & 0xFFFFC0) >> 6) * 200);
#endif
                        stream.IsVBR         = true;
                        stream.IsInitialized = true;
                        break;
                    }
                }
                else if (pictureParse > 0)
                {
                    --pictureParse;
                    if (pictureParse == 0)
                    {
                        switch ((parse & 0x38) >> 3)
                        {
                        case 1:
                            tag = "I";
                            break;

                        case 2:
                            tag = "P";
                            break;

                        case 3:
                            tag = "B";
                            break;

                        default:
                            break;
                        }
                        if (stream.IsInitialized)
                        {
                            return;
                        }
                    }
                }
                else if (parse == 0x000001B5)
                {
                    extensionParse = 1;
                }
                else if (extensionParse > 0)
                {
                    --extensionParse;
                    if (extensionParse == 0)
                    {
                        if ((parse & 0xF0) == 0x10)
                        {
                            sequenceExtensionParse = 1;
                        }
                    }
                }
                else if (sequenceExtensionParse > 0)
                {
                    --sequenceExtensionParse;
#if DEBUG
                    if (sequenceExtensionParse == 0)
                    {
                        uint sequenceExtension =
                            ((parse & 0x8) >> 3);
                        if (sequenceExtension == 0)
                        {
                            stream.IsInterlaced = true;
                        }
                        else
                        {
                            stream.IsInterlaced = false;
                        }
                    }
#endif
                }
            }
        }
Esempio n. 9
0
        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;
        }
Esempio n. 10
0
        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);
            }
        }
Esempio n. 11
0
        public void Scan(TSVideoStream stream, TSStreamBuffer buffer, ref string tag)
        {
            var  parse               = 0;
            byte frameHeaderParse    = 0;
            byte sequenceHeaderParse = 0;
            var  isInterlaced        = false;

            for (var i = 0; i < buffer.Length; i++)
            {
                parse = (parse << 8) + buffer.ReadByte();

                if (parse == 0x0000010D)
                {
                    frameHeaderParse = 4;
                }
                else if (frameHeaderParse > 0)
                {
                    --frameHeaderParse;
                    if (frameHeaderParse != 0)
                    {
                        continue;
                    }

                    uint pictureType = 0;
                    if (isInterlaced)
                    {
                        if ((parse & 0x80000000) == 0)
                        {
                            pictureType = (uint)((parse & 0x78000000) >> 13);
                        }
                        else
                        {
                            pictureType = (uint)((parse & 0x3c000000) >> 12);
                        }
                    }
                    else
                    {
                        pictureType = (uint)((parse & 0xf0000000) >> 14);
                    }

                    if ((pictureType & 0x20000) == 0)
                    {
                        tag = "P";
                    }
                    else if ((pictureType & 0x10000) == 0)
                    {
                        tag = "B";
                    }
                    else if ((pictureType & 0x8000) == 0)
                    {
                        tag = "I";
                    }
                    else if ((pictureType & 0x4000) == 0)
                    {
                        tag = "BI";
                    }
                    else
                    {
                        tag = null;
                    }
                    if (stream.IsInitialized)
                    {
                        return;
                    }
                }
                else if (parse == 0x0000010F)
                {
                    sequenceHeaderParse = 6;
                }
                else if (sequenceHeaderParse > 0)
                {
                    --sequenceHeaderParse;
                    switch (sequenceHeaderParse)
                    {
                    case 5:
                        var profileLevel = (parse & 0x38) >> 3;
                        stream.EncodingProfile = (parse & 0xC0) >> 6 == 3 ? $"Advanced Profile {profileLevel}" : $"Main Profile {profileLevel}";
                        break;

                    case 0:
                        isInterlaced = (parse & 0x40) >> 6 > 0;
                        break;
                    }

                    stream.IsVBR         = true;
                    stream.IsInitialized = true;
                }
            }
        }
Esempio n. 12
0
        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;
        }
Esempio n. 13
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;
            }
        }
Esempio n. 14
0
        public static void Scan(
            TSVideoStream stream,
            TSStreamBuffer buffer,
            ref string tag)
        {
            int parse = 0;
            byte frameHeaderParse = 0;
            byte sequenceHeaderParse = 0;
            bool isInterlaced = false;

            for (int i = 0; i < buffer.Length; i++)
            {
                parse = (parse << 8) + buffer.ReadByte();

                if (parse == 0x0000010D)
                {
                    frameHeaderParse = 4;
                }
                else if (frameHeaderParse > 0)
                {
                    --frameHeaderParse;
                    if (frameHeaderParse == 0)
                    {
                        uint pictureType = 0;
                        if (isInterlaced)
                        {
                            if ((parse & 0x80000000) == 0)
                            {
                                pictureType =
                                    (uint)((parse & 0x78000000) >> 13);
                            }
                            else
                            {
                                pictureType =
                                    (uint)((parse & 0x3c000000) >> 12);
                            }
                        }
                        else
                        {
                            pictureType =
                                (uint)((parse & 0xf0000000) >> 14);
                        }

                        if ((pictureType & 0x20000) == 0)
                        {
                            tag = "P";
                        }
                        else if ((pictureType & 0x10000) == 0)
                        {
                            tag = "B";
                        }
                        else if ((pictureType & 0x8000) == 0)
                        {
                            tag = "I";
                        }
                        else if ((pictureType & 0x4000) == 0)
                        {
                            tag = "BI";
                        }
                        else
                        {
                            tag = null;
                        }
                        if (stream.IsInitialized) return;
                    }
                }
                else if (parse == 0x0000010F)
                {
                    sequenceHeaderParse = 6;
                }
                else if (sequenceHeaderParse > 0)
                {
                    --sequenceHeaderParse;
                    switch (sequenceHeaderParse)
                    {
                        case 5:
                            int profileLevel = ((parse & 0x38) >> 3);
                            if (((parse & 0xC0) >> 6) == 3)
                            {
                                stream.EncodingProfile = string.Format(
                                    "Advanced Profile {0}", profileLevel);
                            }
                            else
                            {
                                stream.EncodingProfile = string.Format(
                                    "Main Profile {0}", profileLevel);
                            }
                            break;

                        case 0:
                            if (((parse & 0x40) >> 6) > 0)
                            {
                                isInterlaced = true;
                            }
                            else
                            {
                                isInterlaced = false;
                            }
                            break;
                    }
                    stream.IsVBR = true;
                    stream.IsInitialized = true;
                }
            }
        }
Esempio n. 15
0
        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;
            }
        }