mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-11-20 04:18:51 -07:00
132 lines
4.8 KiB
C#
132 lines
4.8 KiB
C#
|
//============================================================================
|
|||
|
// 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
|
|||
|
//=============================================================================
|
|||
|
|
|||
|
|
|||
|
namespace BDInfo
|
|||
|
{
|
|||
|
public abstract class TSCodecVC1
|
|||
|
{
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|