Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/thirdparty/MediaInfo/MediaInfo/Video/File_Vc3.cpp')
-rw-r--r--src/thirdparty/MediaInfo/MediaInfo/Video/File_Vc3.cpp233
1 files changed, 195 insertions, 38 deletions
diff --git a/src/thirdparty/MediaInfo/MediaInfo/Video/File_Vc3.cpp b/src/thirdparty/MediaInfo/MediaInfo/Video/File_Vc3.cpp
index 6be29f1a7..fdf0c41c8 100644
--- a/src/thirdparty/MediaInfo/MediaInfo/Video/File_Vc3.cpp
+++ b/src/thirdparty/MediaInfo/MediaInfo/Video/File_Vc3.cpp
@@ -46,6 +46,10 @@ const bool Vc3_FromCID_IsSupported (int32u CompressionID)
case 1251 :
case 1252 :
case 1253 :
+ case 1256 :
+ case 1258 :
+ case 1259 :
+ case 1260 :
return true;
default : return false;
}
@@ -67,6 +71,10 @@ const int32u Vc3_CompressedFrameSize(int32u CompressionID)
case 1251 : return 458752;
case 1252 : return 303104;
case 1253 : return 188416;
+ case 1256 : return 1835008;
+ case 1258 : return 212992;
+ case 1259 : return 417792;
+ case 1260 : return 417792;
default : return 0;
}
};
@@ -87,11 +95,23 @@ const int8u Vc3_SBD_FromCID (int32u CompressionID)
{
switch (CompressionID)
{
+ case 1237 :
+ case 1238 :
+ case 1242 :
+ case 1243 :
+ case 1251 :
+ case 1252 :
+ case 1253 :
+ case 1258 :
+ case 1259 :
+ case 1260 :
+ return 8;
case 1235 :
case 1241 :
case 1250 :
+ case 1256 :
return 10;
- default : return 8;
+ default : return 0;
}
}
@@ -132,11 +152,19 @@ const char* Vc3_SST_FromCID (int32u CompressionID)
{
switch (CompressionID)
{
+ case 1235 :
+ case 1237 :
+ case 1238 :
+ case 1250 :
+ case 1251 :
+ case 1252 :
+ case 1253 :
+ return Vc3_SST[0];
case 1241 :
case 1242 :
case 1243 :
return Vc3_SST[1];
- default : return Vc3_SST[0];
+ default : return "";
}
}
@@ -149,7 +177,15 @@ const int16u Vc3_SPL_FromCID (int32u CompressionID)
case 1251 :
case 1252 :
return 1280;
- default : return 1920;
+ case 1235 :
+ case 1237 :
+ case 1238 :
+ case 1241 :
+ case 1242 :
+ case 1243 :
+ case 1253 :
+ return 1920;
+ default : return 0;
}
}
@@ -162,10 +198,88 @@ const int16u Vc3_ALPF_PerFrame_FromCID (int32u CompressionID)
case 1251 :
case 1252 :
return 720;
- default : return 1080;
+ case 1235 :
+ case 1237 :
+ case 1238 :
+ case 1241 :
+ case 1242 :
+ case 1243 :
+ case 1253 :
+ return 1080;
+ default : return 0;
}
}
+//---------------------------------------------------------------------------
+const char* Vc3_CLR[8]=
+{
+ "YUV",
+ "RGB",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+};
+
+//---------------------------------------------------------------------------
+const char* Vc3_CLR_FromCID (int32u CompressionID)
+{
+ switch (CompressionID)
+ {
+ case 1235 :
+ case 1237 :
+ case 1238 :
+ case 1241 :
+ case 1242 :
+ case 1243 :
+ case 1250 :
+ case 1251 :
+ case 1252 :
+ case 1253 :
+ case 1258 :
+ case 1259 :
+ case 1260 :
+ return Vc3_CLR[0];
+ case 1256 :
+ return Vc3_CLR[1];
+ default : return "";
+ }
+};
+
+//---------------------------------------------------------------------------
+const char* Vc3_SSC[2]=
+{
+ "4:2:2",
+ "", // 4:4:4
+};
+
+//---------------------------------------------------------------------------
+const char* Vc3_SSC_FromCID (int32u CompressionID)
+{
+ switch (CompressionID)
+ {
+ case 1235 :
+ case 1237 :
+ case 1238 :
+ case 1241 :
+ case 1242 :
+ case 1243 :
+ case 1250 :
+ case 1251 :
+ case 1252 :
+ case 1253 :
+ case 1258 :
+ case 1259 :
+ case 1260 :
+ return Vc3_SSC[0];
+ case 1256 :
+ return Vc3_SSC[1];
+ default : return "";
+ }
+};
+
//***************************************************************************
// Constructor/Destructor
//***************************************************************************
@@ -182,7 +296,6 @@ File_Vc3::File_Vc3()
FrameRate=0;
//Temp
- Data_ToParse=0;
FFC_FirstFrame=(int8u)-1;
}
@@ -197,16 +310,20 @@ void File_Vc3::Streams_Fill()
Stream_Prepare(Stream_Video);
Fill(Stream_Video, 0, Video_Format, "VC-3");
Fill(Stream_Video, 0, Video_BitRate_Mode, "CBR");
- if (FrameRate)
+ if (FrameRate && Vc3_CompressedFrameSize(CID))
Fill(Stream_Video, 0, Video_BitRate, Vc3_CompressedFrameSize(CID)*8*FrameRate, 0);
+ Fill(Stream_Video, 0, Video_Format_Version, __T("Version ")+Ztring::ToZtring(HVN));
if (Vc3_FromCID_IsSupported(CID))
{
- Fill(Stream_Video, 0, Video_Width, Vc3_SPL_FromCID(CID));
- Fill(Stream_Video, 0, Video_Height, Vc3_ALPF_PerFrame_FromCID(CID));
- Fill(Stream_Video, 0, Video_BitDepth, Vc3_SBD_FromCID(CID));
+ if (Vc3_SPL_FromCID(CID))
+ Fill(Stream_Video, 0, Video_Width, Vc3_SPL_FromCID(CID));
+ if (Vc3_ALPF_PerFrame_FromCID(CID))
+ Fill(Stream_Video, 0, Video_Height, Vc3_ALPF_PerFrame_FromCID(CID));
+ if (Vc3_SBD_FromCID(CID))
+ Fill(Stream_Video, 0, Video_BitDepth, Vc3_SBD_FromCID(CID));
Fill(Stream_Video, 0, Video_ScanType, Vc3_SST_FromCID(CID));
- Fill(Stream_Video, 0, Video_ColorSpace, "YUV");
- Fill(Stream_Video, 0, Video_ChromaSubsampling, "4:2:2");
+ Fill(Stream_Video, 0, Video_ColorSpace, Vc3_CLR_FromCID(CID));
+ Fill(Stream_Video, 0, Video_ChromaSubsampling, Vc3_SSC_FromCID(CID));
}
else
{
@@ -214,6 +331,8 @@ void File_Vc3::Streams_Fill()
Fill(Stream_Video, 0, Video_Height, ALPF*(SST?2:1));
Fill(Stream_Video, 0, Video_BitDepth, Vc3_SBD(SBD));
Fill(Stream_Video, 0, Video_ScanType, Vc3_SST[SST]);
+ Fill(Stream_Video, 0, Video_ColorSpace, Vc3_CLR[SSC]);
+ Fill(Stream_Video, 0, Video_ChromaSubsampling, Vc3_SSC[CLR]);
}
if (FFC_FirstFrame!=(int8u)-1)
Fill(Stream_Video, 0, Video_ScanOrder, Vc3_FFC_ScanOrder[FFC_FirstFrame]);
@@ -231,7 +350,7 @@ bool File_Vc3::Synchronize()
|| Buffer[Buffer_Offset+1]!=0x00
|| Buffer[Buffer_Offset+2]!=0x02
|| Buffer[Buffer_Offset+3]!=0x80
- || Buffer[Buffer_Offset+4]!=0x01))
+ || Buffer[Buffer_Offset+4]==0x00))
{
Buffer_Offset+=2;
while (Buffer_Offset<Buffer_Size && Buffer[Buffer_Offset]!=0x00)
@@ -276,7 +395,7 @@ bool File_Vc3::Synched_Test()
|| Buffer[Buffer_Offset+1]!=0x00
|| Buffer[Buffer_Offset+2]!=0x02
|| Buffer[Buffer_Offset+3]!=0x80
- || Buffer[Buffer_Offset+4]!=0x01)
+ || Buffer[Buffer_Offset+4]==0x00)
{
Synched=false;
return true;
@@ -298,7 +417,16 @@ bool File_Vc3::Demux_UnpacketizeContainer_Test()
return false;
int32u CompressionID=BigEndian2int32u(Buffer+Buffer_Offset+0x28);
- int32u Size=Vc3_CompressedFrameSize(CompressionID);
+ size_t Size=Vc3_CompressedFrameSize(CompressionID);
+ if (!Size)
+ {
+ if (!IsSub)
+ {
+ Reject();
+ return false;
+ }
+ Size=Buffer_Size; //Hoping that the packet is complete. TODO: add a flag in the container parser saying if the packet is complete
+ }
Demux_Offset=Buffer_Offset+Size;
if (Demux_Offset>Buffer_Size && File_Offset+Buffer_Size!=File_Size)
@@ -329,7 +457,17 @@ void File_Vc3::Header_Parse()
int32u CompressionID=BigEndian2int32u(Buffer+Buffer_Offset+0x28);
Header_Fill_Code(0, "Frame");
- Header_Fill_Size(Vc3_CompressedFrameSize(CompressionID));
+ size_t Size=Vc3_CompressedFrameSize(CompressionID);
+ if (!Size)
+ {
+ if (!IsSub)
+ {
+ Reject();
+ return;
+ }
+ Size=Buffer_Size; //Hoping that the packet is complete. TODO: add a flag in the container parser saying if the packet is complete
+ }
+ Header_Fill_Size(Size);
}
//---------------------------------------------------------------------------
@@ -344,21 +482,23 @@ void File_Vc3::Data_Parse()
{
Element_Info1(Frame_Count+1);
HeaderPrefix();
- CodingControlA();
- Skip_XX(16, "Reserved");
- ImageGeometry();
- Skip_XX( 5, "Reserved");
- CompressionID();
- CodingControlB();
- Skip_XX( 3, "Reserved");
- TimeCode();
-
- Skip_XX(640-Element_Offset, "ToDo");
+ if (HVN <= 2)
+ {
+ CodingControlA();
+ Skip_XX(16, "Reserved");
+ ImageGeometry();
+ Skip_XX( 5, "Reserved");
+ CompressionID();
+ CodingControlB();
+ Skip_XX( 3, "Reserved");
+ TimeCode();
+
+ Skip_XX(640-Element_Offset, "ToDo");
+ }
Skip_XX(Element_Size-Element_Offset, "Data");
}
FILLING_BEGIN();
- Data_ToParse-=Buffer_Size-(size_t)Buffer_Offset;
Frame_Count++;
if (Frame_Count_NotParsedIncluded!=(int64u)-1)
Frame_Count_NotParsedIncluded++;
@@ -389,12 +529,13 @@ void File_Vc3::HeaderPrefix()
{
//Parsing
Element_Begin1("Header Prefix");
- int64u Data;
- Get_B5 (Data, "Contents");
+ int32u Data;
+ Get_B4 (Data, "Magic number");
+ Get_B1 (HVN, "HVN: Header Version Number");
Element_End0();
FILLING_BEGIN();
- if (Data==0x0000028001LL)
+ if (Data==0x00000280LL)
Accept("VC-3");
else
Reject("VC-3");
@@ -419,8 +560,11 @@ void File_Vc3::CodingControlA()
Mark_1();
Mark_0();
- Mark_0();
- Get_SB ( CRCF, "CRC flag");
+ if (HVN==1)
+ Mark_0();
+ else
+ Skip_SB( "MACF: Macroblock Adaptive Control Flag");
+ Get_SB ( CRCF, "CRC flag");
Mark_0();
Mark_0();
Mark_0();
@@ -488,9 +632,6 @@ void File_Vc3::CompressionID()
FILLING_BEGIN();
CID=Data;
- Data_ToParse=Vc3_CompressedFrameSize(Data);
- if (Data_ToParse==0)
- Reject("VC-3");
FILLING_END();
}
@@ -502,13 +643,29 @@ void File_Vc3::CodingControlB()
BS_Begin();
Info_S1(1, FFE, "Field/Frame Count"); Param_Info1(Vc3_FFE[FFE]);
+ if (HVN==1)
+ {
+ Mark_0();
+ SSC=false;
+ }
+ else
+ {
+ Get_SB (SSC, "SSC: Sub Sampling Control"); Param_Info1(Vc3_SSC[SSC]);
+ }
Mark_0();
Mark_0();
Mark_0();
- Mark_0();
- Mark_0();
- Mark_0();
- Mark_0();
+ if (HVN==1)
+ {
+ Mark_0();
+ Mark_0();
+ Mark_0();
+ CLR=0;
+ }
+ else
+ {
+ Get_S1 (3, CLR, "CLR: Color"); Param_Info1(Vc3_CLR[CLR]);
+ }
BS_End();
Element_End0();