diff options
Diffstat (limited to 'BDInfo/TSCodecDTS.cs')
| -rw-r--r-- | BDInfo/TSCodecDTS.cs | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/BDInfo/TSCodecDTS.cs b/BDInfo/TSCodecDTS.cs new file mode 100644 index 000000000..90af48e93 --- /dev/null +++ b/BDInfo/TSCodecDTS.cs @@ -0,0 +1,162 @@ +//============================================================================ +// BDInfo - Blu-ray Video and Audio Analysis Tool +// Copyright © 2010 Cinema Squid +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//============================================================================= + +using System; +using System.Collections.Generic; +using System.Text; + +namespace BDInfo +{ + public abstract class TSCodecDTS + { + private static int[] dca_sample_rates = + { + 0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0, + 12000, 24000, 48000, 96000, 192000 + }; + + private static int[] dca_bit_rates = + { + 32000, 56000, 64000, 96000, 112000, 128000, + 192000, 224000, 256000, 320000, 384000, + 448000, 512000, 576000, 640000, 768000, + 896000, 1024000, 1152000, 1280000, 1344000, + 1408000, 1411200, 1472000, 1509000, 1920000, + 2048000, 3072000, 3840000, 1/*open*/, 2/*variable*/, 3/*lossless*/ + }; + + private static int[] dca_channels = + { + 1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8 + }; + + private static int[] dca_bits_per_sample = + { + 16, 16, 20, 20, 0, 24, 24 + }; + + 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; + } + } + } +} |
