// http://dvd.sourceforge.net/dvdinfo/ifo.html#vidatt public static VideoValues ReadVideoSpecs(byte b1, byte b2) { int byte0_high = (b1 & 0xF0) >> 4; int byte0_low = (b1 & 0x0F); int byte1_high = (b2 & 0xF0) >> 4; int byte1_low = (b2 & 0x0F); VideoValues result = new VideoValues(); result.DisallowAutoLetterbox = (byte0_low & 1) != 0; result.DisallowAutoPanScan = (byte0_low & 2) != 0; result.AspectRatio = (byte0_low & 0x0C) == 0 ? 1.33f : 1.78f; if (((byte0_low & 0x0C) != 0) && ((byte0_low & 0x0C) != 0x0C)) { throw new Exception("the aspectRatio is not valid"); } result.Ntsc = (byte0_high & 1) == 0; result.Pal = (byte0_high & 1) != 0; result.Mpeg1 = (byte0_high & 0x0C) == 0; result.Mpeg2 = (byte0_high & 0x0C) == 4; result.Film = (byte1_low & 1) != 0; result.LetterBoxedMode = (byte1_low & 2) != 0; // 0 = 720x480 (720x576) // 1 = 704x480 (704x576) // 2 = 352x480 (352x576) // 3 = 352x240 (352x288) if (result.Ntsc) { switch ((byte1_low >> 2) & 0x03) { case 0: result.Resolution = new Size(720, 480); break; case 1: result.Resolution = new Size(704, 480); break; case 2: result.Resolution = new Size(352, 480); break; case 3: result.Resolution = new Size(352, 240); break; } } else { switch ((byte1_low >> 2) & 0x03) { case 0: result.Resolution = new Size(720, 576); break; case 1: result.Resolution = new Size(704, 576); break; case 2: result.Resolution = new Size(352, 576); break; case 3: result.Resolution = new Size(352, 288); break; } } result.BitRate_Vbr = (byte1_high & 1) == 0; result.BitRate_Cbr = (byte1_high & 1) != 0; result.CC_line21_f2 = (byte1_high & 4) != 0; result.CC_line21_f1 = (byte1_high & 8) != 0; return(result); }
public static List <DVDTitle> Titles(string videoTSDir) { List <DVDTitle> ret = new List <DVDTitle>(); string videoIFO = Path.Combine(videoTSDir, "VIDEO_TS.IFO"); if (File.Exists(videoIFO)) { byte[] bytRead = new byte[4]; long VMG_PTT_STPT_Position = ToFilePosition(GetFileBlock(videoIFO, 0xC4, 4)); int titlePlayMaps = ToInt16(GetFileBlock(videoIFO, VMG_PTT_STPT_Position, 2)); string longestIfo = GetLongestIFO(videoTSDir); for (int currentTitle = 1; currentTitle <= titlePlayMaps; ++currentTitle) { DVDTitle title = new DVDTitle() { TitleNumber = currentTitle }; long titleInfoStart = 8 + ((currentTitle - 1) * 12); int titleSetNumber = GetFileBlock(videoIFO, (VMG_PTT_STPT_Position + titleInfoStart) + 6L, 1)[0]; int titleSetTitleNumber = IFOUtilities.GetFileBlock(videoIFO, (VMG_PTT_STPT_Position + titleInfoStart) + 7L, 1)[0]; string vtsIFO = Path.Combine(videoTSDir, string.Format("VTS_{0:D2}_0.IFO", titleSetNumber)); if (File.Exists(vtsIFO) == false) { Trace.WriteLine(string.Format("IFOUtils.Titles: VTS IFO file missing: {0}", Path.GetFileName(vtsIFO))); continue; } byte[] b = IFOUtilities.GetFileBlock(vtsIFO, 0x200, 2); VideoValues video = VideoValues.ReadVideoSpecs(b[0], b[1]); title.Main = Path.GetFileName(longestIfo) == Path.GetFileName(vtsIFO); title.File = "vts " + titleSetNumber; title.AspectRatio = video.AspectRatio; title.Resolution = video.Resolution; title.Chapters = Chapters(vtsIFO, titleSetTitleNumber); title.AudioTracks = AudioTracks(vtsIFO); title.Subtitles = SubTitleTracks(vtsIFO); title.Duration = DVDTitle.GetTotalTimeSpan(title.Chapters); //if (title.Duration.TotalSeconds > 10) ret.Add(title); //else // Trace.WriteLine(string.Format("IFOUtils.Titles: Duration < 10s, ignoring: {0}", Path.GetFileName(vtsIFO))); } } else { Trace.WriteLine(string.Format("IFOUtilities.Titles: Cannot analyze DVD, file {0} not found", videoIFO)); } return(ret); }
// http://dvd.sourceforge.net/dvdinfo/ifo.html#vidatt public static VideoValues ReadVideoSpecs(byte b1, byte b2) { int byte0_high = (b1 & 0xF0) >> 4; int byte0_low = (b1 & 0x0F); int byte1_high = (b2 & 0xF0) >> 4; int byte1_low = (b2 & 0x0F); VideoValues result = new VideoValues(); result.DisallowAutoLetterbox = (byte0_low & 1) != 0; result.DisallowAutoPanScan = (byte0_low & 2) != 0; result.AspectRatio = (byte0_low & 0x0C) == 0 ? 1.33f : 1.78f; if (((byte0_low & 0x0C) != 0) && ((byte0_low & 0x0C) != 0x0C)) throw new Exception("the aspectRatio is not valid"); result.Ntsc = (byte0_high & 1) == 0; result.Pal = (byte0_high & 1) != 0; result.Mpeg1 = (byte0_high & 0x0C) == 0; result.Mpeg2 = (byte0_high & 0x0C) == 4; result.Film = (byte1_low & 1) != 0; result.LetterBoxedMode = (byte1_low & 2) != 0; // 0 = 720x480 (720x576) // 1 = 704x480 (704x576) // 2 = 352x480 (352x576) // 3 = 352x240 (352x288) if (result.Ntsc) switch ((byte1_low >> 2) & 0x03) { case 0: result.Resolution = new Size(720, 480); break; case 1: result.Resolution = new Size(704, 480); break; case 2: result.Resolution = new Size(352, 480); break; case 3: result.Resolution = new Size(352, 240); break; } else switch ((byte1_low >> 2) & 0x03) { case 0: result.Resolution = new Size(720, 576); break; case 1: result.Resolution = new Size(704, 576); break; case 2: result.Resolution = new Size(352, 576); break; case 3: result.Resolution = new Size(352, 288); break; } result.BitRate_Vbr = (byte1_high & 1) == 0; result.BitRate_Cbr = (byte1_high & 1) != 0; result.CC_line21_f2 = (byte1_high & 4) != 0; result.CC_line21_f1 = (byte1_high & 8) != 0; return result; }