/* Copyright (c) MediaArea.net SARL. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license that can
* be found in the License.html file in the root of the source tree.
*/
//---------------------------------------------------------------------------
// Pre-compilation
#include "MediaInfo/PreComp.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include "MediaInfo/Setup.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#if defined(MEDIAINFO_DIRAC_YES)
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include "MediaInfo/Video/File_Dirac.h"
//---------------------------------------------------------------------------
namespace MediaInfoLib
{
//---------------------------------------------------------------------------
const char* Dirac_base_video_format(intu base_video_format)
{
switch (base_video_format)
{
case 1 : return "QSIF525";
case 2 : return "QCIF";
case 3 : return "SIF525";
case 4 : return "CIF";
case 5 : return "4SIF525";
case 6 : return "4CIF";
case 7 : return "480i60";
case 8 : return "576i50";
case 9 : return "720p50";
case 10 : return "720p60";
case 11 : return "1080i60";
case 12 : return "1080i50";
case 13 : return "1080p60";
case 14 : return "1080p60";
case 15 : return "2K-24";
case 16 : return "4K-24";
case 17 : return "4K-60";
case 18 : return "4K-50";
case 19 : return "8K-60";
case 20 : return "8K-50";
default : return "";
}
}
//---------------------------------------------------------------------------
float32 Dirac_frame_rate(int32u frame_rate_index)
{
switch (frame_rate_index)
{
case 0 : return (float32)0; //Reserved
case 1 : return (float32)24000/(float32)1001;
case 2 : return (float32)24;
case 3 : return (float32)25;
case 4 : return (float32)30000/(float32)1001;
case 5 : return (float32)30;
case 6 : return (float32)50;
case 7 : return (float32)60000/(float32)1001;
case 8 : return (float32)60;
case 9 : return (float32)15000/(float32)1001;
case 10 : return (float32)12.5;
default : return (float32)0; //Unknown
}
}
//---------------------------------------------------------------------------
float32 Dirac_pixel_aspect_ratio(int32u pixel_aspect_ratio_index)
{
switch (pixel_aspect_ratio_index)
{
case 0 : return (float32)0; //Reserved
case 1 : return (float32)1; //Reserved
case 2 : return (float32)10/(float32)11;
case 3 : return (float32)12/(float32)11;
case 4 : return (float32)40/(float32)33;
case 5 : return (float32)16/(float32)11;
case 6 : return (float32) 4/(float32) 3;
default : return (float32)0; //Unknown
}
}
//---------------------------------------------------------------------------
const char* Dirac_picture_coding_mode(int32u picture_coding_mode)
{
switch (picture_coding_mode)
{
case 0 : return "PPF";
case 1 : return "Interlaced";
default: return "";
}
}
//---------------------------------------------------------------------------
const char* Dirac_source_sampling(int32u source_sampling)
{
switch (source_sampling)
{
case 0 : return "Progressive";
case 1 : return "Interlaced";
default: return "";
}
}
//---------------------------------------------------------------------------
const char* Dirac_source_sampling_Codec(int32u source_sampling)
{
switch (source_sampling)
{
case 0 : return "PPF";
case 1 : return "Interlaced";
default: return "";
}
}
//---------------------------------------------------------------------------
const char* Dirac_chroma_format(int32u chroma_format)
{
switch (chroma_format)
{
case 0 : return "4:4:4";
case 1 : return "4:2:2";
case 2 : return "4:2:0";
default: return "";
}
}
//---------------------------------------------------------------------------
void Dirac_base_video_format(int32u base_video_format,
int32u &frame_width,
int32u &frame_height,
int32u &chroma_format,
int32u &source_sampling,
int32u &clean_width,
int32u &clean_height,
int32u &clean_left_offset,
int32u &clean_top_offset,
float32 &frame_rate,
float32 &pixel_aspect_ratio)
{
switch (base_video_format)
{
case 0 : frame_width=640;
frame_height=480;
chroma_format=2;
source_sampling=0;
clean_width=640;
clean_height=480;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(1);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 1 : frame_width=176;
frame_height=120;
chroma_format=2;
source_sampling=0;
clean_width=176;
clean_height=144;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(9);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(2);
return;
case 2 : frame_width=176;
frame_height=144;
chroma_format=2;
source_sampling=0;
clean_width=176;
clean_height=144;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(10);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(3);
return;
case 3 : frame_width=352;
frame_height=240;
chroma_format=2;
source_sampling=0;
clean_width=352;
clean_height=240;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(9);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(2);
return;
case 4 : frame_width=352;
frame_height=288;
chroma_format=2;
source_sampling=0;
clean_width=352;
clean_height=288;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(10);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(3);
return;
case 5 : frame_width=704;
frame_height=480;
chroma_format=2;
source_sampling=0;
clean_width=704;
clean_height=480;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(9);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(2);
return;
case 6 : frame_width=704;
frame_height=576;
chroma_format=2;
source_sampling=0;
clean_width=704;
clean_height=576;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(10);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(3);
return;
case 7 : frame_width=720;
frame_height=480;
chroma_format=1;
source_sampling=1;
clean_width=704;
clean_height=480;
clean_left_offset=8;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(4);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(2);
return;
case 8 : frame_width=720;
frame_height=576;
chroma_format=1;
source_sampling=1;
clean_width=704;
clean_height=576;
clean_left_offset=8;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(3);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(3);
return;
case 9 : frame_width=1280;
frame_height=720;
chroma_format=1;
source_sampling=0;
clean_width=1280;
clean_height=720;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(7);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 10 : frame_width=1280;
frame_height=720;
chroma_format=1;
source_sampling=0;
clean_width=1280;
clean_height=720;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(6);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 11 : frame_width=1920;
frame_height=1080;
chroma_format=1;
source_sampling=1;
clean_width=1920;
clean_height=1080;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(4);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 12 : frame_width=1920;
frame_height=1080;
chroma_format=1;
source_sampling=1;
clean_width=1920;
clean_height=1080;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(3);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 13 : frame_width=1920;
frame_height=1080;
chroma_format=1;
source_sampling=0;
clean_width=1920;
clean_height=1080;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(7);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 14 : frame_width=1920;
frame_height=1080;
chroma_format=1;
source_sampling=0;
clean_width=1920;
clean_height=1080;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(6);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 15 : frame_width=2048;
frame_height=1080;
chroma_format=0;
source_sampling=0;
clean_width=2048;
clean_height=1080;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(2);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 16 : frame_width=4096;
frame_height=2160;
chroma_format=0;
source_sampling=0;
clean_width=4096;
clean_height=2160;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(2);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 17 : frame_width=3840;
frame_height=2160;
chroma_format=0;
source_sampling=0;
clean_width=3840;
clean_height=2160;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(7);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 18 : frame_width=3840;
frame_height=2160;
chroma_format=0;
source_sampling=0;
clean_width=3840;
clean_height=2160;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(6);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 19 : frame_width=7680;
frame_height=4320;
chroma_format=0;
source_sampling=0;
clean_width=7680;
clean_height=4320;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(7);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
case 20 : frame_width=7680;
frame_height=4320;
chroma_format=0;
source_sampling=0;
clean_width=7680;
clean_height=4320;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate(6);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(1);
return;
default : frame_width=0;
frame_height=0;
chroma_format=(int32u)-1;
source_sampling=(int32u)-1;
clean_width=0;
clean_height=0;
clean_left_offset=0;
clean_top_offset=0;
frame_rate=Dirac_frame_rate((int32u)-1);
pixel_aspect_ratio=Dirac_pixel_aspect_ratio((int32u)-1);
return;
}
}
//***************************************************************************
// Constructor/Destructor
//***************************************************************************
//---------------------------------------------------------------------------
File_Dirac::File_Dirac()
:File__Analyze()
{
//Configuration
MustSynchronize=true;
Buffer_TotalBytes_FirstSynched_Max=64*1024;
//In
Frame_Count_Valid=1;
Ignore_End_of_Sequence=false;
}
//***************************************************************************
// Streams management
//***************************************************************************
//---------------------------------------------------------------------------
void File_Dirac::Streams_Fill()
{
Stream_Prepare(Stream_Video);
Fill(Stream_Video, 0, Video_Format, "Dirac");
Fill(Stream_Video, 0, Video_Codec, "Dirac");
if (clean_width)
Fill(Stream_Video, StreamPos_Last, Video_Width, clean_width);
if (clean_height)
Fill(Stream_Video, StreamPos_Last, Video_Height, clean_height);
if (pixel_aspect_ratio)
{
Fill(Stream_Video, 0, Video_PixelAspectRatio, pixel_aspect_ratio, 3, true);
if (clean_height!=0)
Fill(Stream_Video, StreamPos_Last, Video_DisplayAspectRatio, ((float)clean_width)/clean_height*pixel_aspect_ratio, 3, true);
}
if (frame_rate)
Fill(Stream_Video, StreamPos_Last, Video_FrameRate, frame_rate);
Fill(Stream_Video, 0, Video_ChromaSubsampling, Dirac_chroma_format(chroma_format));
Fill(Stream_Video, 0, Video_ScanType, Dirac_source_sampling(source_sampling));
Fill(Stream_Video, 0, Video_Interlacement, Dirac_source_sampling_Codec(source_sampling));
}
//---------------------------------------------------------------------------
void File_Dirac::Streams_Finish()
{
//Purge what is not needed anymore
if (!File_Name.empty()) //Only if this is not a buffer, with buffer we can have more data
Streams.clear();
}
//***************************************************************************
// Buffer - Synchro
//***************************************************************************
//---------------------------------------------------------------------------
bool File_Dirac::Synchronize()
{
//Synchronizing
while(Buffer_Offset+4<=Buffer_Size && (Buffer[Buffer_Offset ]!=0x42
|| Buffer[Buffer_Offset+1]!=0x42
|| Buffer[Buffer_Offset+2]!=0x43
|| Buffer[Buffer_Offset+3]!=0x44)) //"BBCD"
{
Buffer_Offset+=2;
while(Buffer_Offset<Buffer_Size && Buffer[Buffer_Offset]!=0x42)
Buffer_Offset+=2;
if (Buffer_Offset>=Buffer_Size || Buffer[Buffer_Offset-1]==0x42)
Buffer_Offset--;
}
//Parsing last bytes if needed
if (Buffer_Offset+4>Buffer_Size)
{
if (Buffer_Offset+3==Buffer_Size && CC3(Buffer+Buffer_Offset)!=0x424243) //"BBC"
Buffer_Offset++;
if (Buffer_Offset+2==Buffer_Size && CC2(Buffer+Buffer_Offset)!=0x4242) //"BB"
Buffer_Offset++;
if (Buffer_Offset+1==Buffer_Size && CC1(Buffer+Buffer_Offset)!=0x42) //"B"
Buffer_Offset++;
return false;
}
//Synched is OK
return true;
}
//---------------------------------------------------------------------------
bool File_Dirac::Synched_Test()
{
//Must have enough buffer for having header
if (Buffer_Offset+4>Buffer_Size)
return false;
//Quick test of synchro
if (CC4(Buffer+Buffer_Offset)!=0x42424344) //"BBCD"
Synched=false;
//Quick search
if (Synched && !Header_Parser_QuickSearch())
return false;
//We continue
return true;
}
//---------------------------------------------------------------------------
void File_Dirac::Synched_Init()
{
//Temp
Dirac_base_video_format((int32u)-1, frame_width, frame_height, chroma_format, source_sampling,
clean_width, clean_height, clean_left_offset, clean_top_offset,
frame_rate, pixel_aspect_ratio);
//Default stream values
Streams.resize(0x100);
Streams[0x00].Searching_Payload=true; //Sequence header
}
//***************************************************************************
// Buffer - Per element
//***************************************************************************
//---------------------------------------------------------------------------
void File_Dirac::Header_Parse()
{
//Parsing
int32u Next_Parse_Offset, Previous_Parse_Offset;
int8u Parse_Code;
Skip_C4( "Parse Info Prefix");
Get_B1 (Parse_Code, "Parse Code");
Get_B4 (Next_Parse_Offset, "Next Parse Offset");
Get_B4 (Previous_Parse_Offset, "Previous Parse Offset");
//Filling
Header_Fill_Code(Parse_Code, Ztring().From_CC1(Parse_Code));
Header_Fill_Size((Parse_Code==0x10 && Next_Parse_Offset==0)?13:Next_Parse_Offset); //Speacial case if this is the End Of Sequence
}
//---------------------------------------------------------------------------
bool File_Dirac::Header_Parser_QuickSearch()
{
while ( Buffer_Offset+5<=Buffer_Size
&& Buffer[Buffer_Offset ]==0x42
&& Buffer[Buffer_Offset+1]==0x42
&& Buffer[Buffer_Offset+2]==0x43
&& Buffer[Buffer_Offset+3]==0x44) //"BBCD"
{
//Getting start_code
int8u start_code=CC1(Buffer+Buffer_Offset+4);
//Searching start
if (Streams[start_code].Searching_Payload)
return true;
//Getting size
Buffer_Offset+=BigEndian2int32u(Buffer+Buffer_Offset+5);
}
if (Buffer_Offset+4==Buffer_Size)
return false; //Sync is OK, but start_code is not available
if (Buffer_Offset+5<=Buffer_Size)
Trusted_IsNot("Dirac, Synchronisation lost");
Synched=false;
return Synchronize();
}
//---------------------------------------------------------------------------
void File_Dirac::Data_Parse()
{
//Parsing
switch (Element_Code)
{
case 0x00 : Sequence_header(); break;
case 0x10 : End_of_Sequence(); break;
case 0x20 : Auxiliary_data(); break;
case 0x30 : Padding_data(); break;
case 0x0C : Intra_Reference_Picture(); break;
case 0x08 : Intra_Non_Reference_Picture(); break;
case 0x4C : Intra_Reference_Picture_No(); break;
case 0x48 : Intra_Non_Reference_Picture_No(); break;
case 0x0D : Inter_Reference_Picture_1(); break;
case 0x0E : Inter_Reference_Picture_2(); break;
case 0x09 : Inter_Non_Reference_Picture_1(); break;
case 0x0A : Inter_Non_Reference_Picture_2(); break;
case 0xCC : Reference_Picture_Low(); break;
case 0xC8 : Intra_Non_Reference_Picture_Low(); break;
default : Reserved();
}
}
//***************************************************************************
// Elements
//***************************************************************************
//---------------------------------------------------------------------------
// Packet "00"
void File_Dirac::Sequence_header()
{
Element_Name("Sequence header");
//Parsing
int32u version_major, version_minor, profile, level, base_video_format;
BS_Begin();
Get_UI(version_major, "version major");
Get_UI(version_minor, "version minor");
Get_UI(profile, "profile");
Get_UI(level, "level");
if (version_major<=2)
{
Get_UI(base_video_format, "base video format"); //Param_Info1(Dirac_base_video_format(base_video_format));
Dirac_base_video_format(base_video_format, frame_width, frame_height, chroma_format, source_sampling,
clean_width, clean_height, clean_left_offset, clean_top_offset,
frame_rate, pixel_aspect_ratio);
TEST_SB_SKIP( "custom dimensions flag");
Get_UI (frame_width, "frame width");
Get_UI (frame_height, "frame height");
TEST_SB_END();
TEST_SB_SKIP( "custom chroma format flag");
Get_UI (chroma_format, "chroma format"); Param_Info1(Dirac_chroma_format(chroma_format));
TEST_SB_END();
TEST_SB_SKIP( "custom scan format flag");
Get_UI (source_sampling, "source sampling"); Param_Info1(Dirac_source_sampling(source_sampling));
TEST_SB_END();
TEST_SB_SKIP( "frame rate flag");
int32u frame_rate_index;
Get_UI (frame_rate_index, "index"); Param_Info1(Dirac_frame_rate(frame_rate_index));
if (frame_rate_index==0)
{
int32u frame_rate_numer, frame_rate_denom;
Get_UI (frame_rate_numer, "frame rate numer");
Get_UI (frame_rate_denom, "frame rate denom");
frame_rate=((float32)frame_rate_numer)/((float32)frame_rate_denom);
}
else
frame_rate=Dirac_frame_rate(frame_rate_index);
TEST_SB_END();
TEST_SB_SKIP( "pixel aspect ratio flag");
int32u pixel_aspect_ratio_index;
Get_UI (pixel_aspect_ratio_index, "index"); Param_Info1(Dirac_pixel_aspect_ratio(pixel_aspect_ratio_index));
if (pixel_aspect_ratio_index==0)
{
int32u pixel_aspect_ratio_numer, pixel_aspect_ratio_denom;
Get_UI (pixel_aspect_ratio_numer, "pixel aspect ratio numer");
Get_UI (pixel_aspect_ratio_denom, "pixel aspect ratio denom");
pixel_aspect_ratio=((float32)pixel_aspect_ratio_numer)/((float32)pixel_aspect_ratio_denom);
}
else
pixel_aspect_ratio=Dirac_pixel_aspect_ratio(pixel_aspect_ratio_index);
TEST_SB_END();
TESTELSE_SB_SKIP( "custom clean area flag");
Get_UI (clean_width, "clean width");
Get_UI (clean_height, "clean height");
Get_UI (clean_left_offset, "clean left offset");
Get_UI (clean_top_offset, "clean top offset");
TESTELSE_SB_ELSE( "custom clean area flag");
clean_width=frame_width;
clean_height=frame_height;
TESTELSE_SB_END();
TEST_SB_SKIP( "custom signal range flag");
int32u custom_signal_range_index;
Get_UI(custom_signal_range_index, "index");
if (custom_signal_range_index==0)
{
Skip_UI( "luma offset");
Skip_UI( "luma excursion");
Skip_UI( "chroma offset");
Skip_UI( "chroma excursion");
}
TEST_SB_END();
TEST_SB_SKIP( "custom colour spec flag");
int32u custom_colour_spec_index;
Get_UI(custom_colour_spec_index, "index");
if (custom_colour_spec_index==0)
{
TEST_SB_SKIP( "custom colour primaries flag");
Skip_UI( "custom colour primaries index");
TEST_SB_END();
TEST_SB_SKIP( "colour matrix flag");
Skip_UI( "colour matrix index");
TEST_SB_END();
TEST_SB_SKIP( "custom transfer function flag");
Skip_UI( "custom transfer function index");
TEST_SB_END();
}
TEST_SB_END();
Info_UI(picture_coding_mode, "picture coding mode"); Param_Info1(Dirac_picture_coding_mode(picture_coding_mode));
}
else
{
Skip_XX(Element_Size-Element_Offset, "Unknown");
}
FILLING_BEGIN();
//Autorisation of other streams
Streams[0x10].Searching_Payload=true; //End_of_Sequence
Streams[0x20].Searching_Payload=true; //Auxiliary_data
Streams[0x30].Searching_Payload=true; //Padding_data
Streams[0x0C].Searching_Payload=true; //Intra_Reference_Picture
Streams[0x08].Searching_Payload=true; //Intra_Non_Reference_Picture
Streams[0x4C].Searching_Payload=true; //Intra_Reference_Picture_No
Streams[0x48].Searching_Payload=true; //Intra_Non_Reference_Picture_No
Streams[0x0D].Searching_Payload=true; //Inter_Reference_Picture_1
Streams[0x0E].Searching_Payload=true; //Inter_Reference_Picture_2
Streams[0x09].Searching_Payload=true; //Inter_Non_Reference_Picture_1
Streams[0x0A].Searching_Payload=true; //Inter_Non_Reference_Picture_2
Streams[0xCC].Searching_Payload=true; //Reference_Picture_Low
Streams[0xC8].Searching_Payload=true; //Intra_Non_Reference_Picture_Low
FILLING_END();
}
//---------------------------------------------------------------------------
// Packet "10"
void File_Dirac::End_of_Sequence()
{
Element_Name("End of Sequence");
//Parsing
if (!Ignore_End_of_Sequence)
{
NextCode_Clear();
Accept("Dirac");
Finish("Dirac");
}
}
//---------------------------------------------------------------------------
// Packet "20"
void File_Dirac::Auxiliary_data()
{
Element_Name("Auxiliary data");
//Parsing
Skip_XX(Element_Size, "Auxiliary data");
}
//---------------------------------------------------------------------------
// Packet "30"
void File_Dirac::Padding_data()
{
Element_Name("Padding data");
//Parsing
Skip_XX(Element_Size, "Padding data");
}
//---------------------------------------------------------------------------
// Packet "0C"
void File_Dirac::Intra_Reference_Picture()
{
Element_Name("Intra Reference Picture");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "08"
void File_Dirac::Intra_Non_Reference_Picture()
{
Element_Name("Intra Non Reference Picture");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "4C"
void File_Dirac::Intra_Reference_Picture_No()
{
Element_Name("Intra Reference Picture (no arithmetic coding)");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "48"
void File_Dirac::Intra_Non_Reference_Picture_No()
{
Element_Name("Intra Non Reference Picture (no arithmetic coding)");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "0D"
void File_Dirac::Inter_Reference_Picture_1()
{
Element_Name("Inter Reference Picture (1 picture)");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "0E"
void File_Dirac::Inter_Reference_Picture_2()
{
Element_Name("Inter Reference Picture (2 pictures)");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "09"
void File_Dirac::Inter_Non_Reference_Picture_1()
{
Element_Name("Inter Non Reference Picture (1 picture)");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "0A"
void File_Dirac::Inter_Non_Reference_Picture_2()
{
Element_Name("Inter Non Reference Picture (2 pictures)");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "CC"
void File_Dirac::Reference_Picture_Low()
{
Element_Name("Reference Picture (low-delay)");
//Parsing
picture();
}
//---------------------------------------------------------------------------
// Packet "C8"
void File_Dirac::Intra_Non_Reference_Picture_Low()
{
Element_Name("Intra Non Reference Picture (low-delay)");
//Parsing
picture();
}
//---------------------------------------------------------------------------
void File_Dirac::Reserved()
{
Element_Name("Reserved");
Skip_XX(Element_Size, "Unknown");
}
//---------------------------------------------------------------------------
void File_Dirac::picture()
{
//Parsing
Skip_XX(Element_Size, "Data");
FILLING_BEGIN();
//Counting
if (File_Offset+Buffer_Offset+Element_Size==File_Size)
Frame_Count_Valid=Frame_Count; //Finalize frames in case of there are less than Frame_Count_Valid frames
//Name
Element_Info1(Ztring::ToZtring(Frame_Count));
//Filling only if not already done
Frame_Count++;
Frame_Count_InThisBlock++;
if (Frame_Count>=Frame_Count_Valid && Count_Get(Stream_Video)==0)
{
NextCode_Clear();
Accept("Dirac");
Finish("Dirac");
}
FILLING_END();
}
//***************************************************************************
// C++
//***************************************************************************
} //NameSpace
#endif //MEDIAINFO_DIRAC_YES
↑ V1037 Two or more case-branches perform the same actions. Check lines: 47, 48
↑ V550 An odd precise comparison. It's probably better to use a comparison with defined precision: fabs(pixel_aspect_ratio) > Epsilon.
↑ V550 An odd precise comparison. It's probably better to use a comparison with defined precision: fabs(frame_rate) > Epsilon.
↑ V730 Not all members of a class are initialized inside the constructor. Consider inspecting: frame_width, frame_height, chroma_format, source_sampling, clean_width, clean_height, ...