Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 88 additions & 1 deletion Source/MediaInfo/Image/File_Png.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ static const char* Keywords_Mapping[][2]=
//***************************************************************************

//---------------------------------------------------------------------------
File_Png::File_Png() : Data_Size{}, Signature{}
File_Png::File_Png()
{
//Config
#if MEDIAINFO_TRACE
Expand Down Expand Up @@ -190,6 +190,12 @@ void File_Png::Streams_Accept()
//---------------------------------------------------------------------------
void File_Png::Streams_Finish()
{
if (isAPNG) {
Fill(StreamKind, 0, Video_Duration, duration * 1000);
Fill(StreamKind, 0, Video_FrameCount, framecount);
Fill(StreamKind, 0, Video_FrameRate_Minimum, framerate_min);
Fill(StreamKind, 0, Video_FrameRate_Maximum, framerate_max);
}
if (Data_Size != (int64u)-1) {
if (StreamKind == Stream_Video && !IsSub && File_Size != (int64u)-1 && !Config->File_Sizes.empty())
Fill(Stream_Video, 0, Video_StreamSize, File_Size - (Config->File_Sizes.front() - Data_Size) * Config->File_Sizes.size()); //We guess that the metadata part has a fixed size
Expand Down Expand Up @@ -357,6 +363,8 @@ void File_Png::Data_Parse()
//---------------------------------------------------------------------------
void File_Png::IDAT()
{
IDATseen = true;

//Parsing
Skip_XX(Element_TotalSize_Get()-4, "Data");
Param2("CRC", "(Skipped) (4 bytes)");
Expand Down Expand Up @@ -498,6 +506,40 @@ void File_Png::MHDR()
Data_Common();
}

//---------------------------------------------------------------------------
void File_Png::acTL()
{
//Parsing
int32u num_plays;
Skip_B4( "num_frames");
Get_B4(num_plays, "num_plays");

FILLING_BEGIN_PRECISE()
if (!IDATseen && Signature == 0x89504E47) {
if (StreamKind == Stream_Image) {
StreamKind = Stream_Video;
Stream_Prepare(StreamKind);
Fill(StreamKind, 0, "Format_Settings_Packing", Retrieve_Const(Stream_Image, 0, "Format_Settings_Packing"));
Fill(StreamKind, 0, "Format_Settings", Retrieve_Const(Stream_Image, 0, "Format_Settings"));
Fill(StreamKind, 0, "Width", Retrieve_Const(Stream_Image, 0, "Width"));
Fill(StreamKind, 0, "Height", Retrieve_Const(Stream_Image, 0, "Height"));
Fill(StreamKind, 0, "ColorSpace", Retrieve_Const(Stream_Image, 0, "ColorSpace"));
Fill(StreamKind, 0, "BitDepth", Retrieve_Const(Stream_Image, 0, "BitDepth"));
Fill(StreamKind, 0, "PixelAspectRatio", Retrieve_Const(Stream_Image, 0, "PixelAspectRatio"));
Fill(StreamKind, 0, "Format_Compression", Retrieve_Const(Stream_Image, 0, "Format_Compression"));
Stream_Erase(Stream_Image, 0);
}
isAPNG = true;
Fill(Stream_General, 0, General_Format, "APNG", Unlimited, true, true);
Fill(StreamKind, 0, Video_Format, "APNG", Unlimited, true, true);
if (num_plays)
Fill(StreamKind, 0, "RepeatCount", num_plays);
else
Fill(StreamKind, 0, "RepeatCount", "Unlimited");
}
FILLING_END()
}

//---------------------------------------------------------------------------
void File_Png::caBX()
{
Expand Down Expand Up @@ -576,6 +618,51 @@ void File_Png::eXIf()
#endif
}

//---------------------------------------------------------------------------
void File_Png::fcTL()
{
//Parsing
int16u delay_num, delay_den;
float64 framerate{};
Skip_B4( "sequence_number");
Skip_B4( "width");
Skip_B4( "height");
Skip_B4( "x_offset");
Skip_B4( "y_offset");
Get_B2(delay_num, "delay_num");
Get_B2(delay_den, "delay_den");
Skip_B1( "dispose_op");
Skip_B1( "blend_op");
Data_Common();

FILLING_BEGIN()
++framecount;
if (delay_num) {
if (delay_den) {
duration += static_cast<float64>(delay_num) / delay_den;
framerate = static_cast<float64>(delay_den) / delay_num;
}
else {
duration += static_cast<float64>(delay_num) / 100;
framerate = static_cast<float64>(100) / delay_num;
}
}
if (framerate_min == 0 || framerate < framerate_min)
framerate_min = framerate;
if (framerate > framerate_max)
framerate_max = framerate;
FILLING_END()
}

//---------------------------------------------------------------------------
void File_Png::fdAT()
{
//Parsing
Skip_B4( "sequence_number");
Skip_XX(Element_Size - Element_Offset, "frame_data");
Data_Common();
}

//---------------------------------------------------------------------------
void File_Png::gAMA()
{
Expand Down
16 changes: 11 additions & 5 deletions Source/MediaInfo/Image/File_Png.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ private :
void MEND() { Data_Common(); }
void MHDR();
void PLTE() { Data_Common(); }
void acTL() { Data_Common(); }
void acTL();
void bKGD() { Data_Common(); }
void caBX();
void caNv() { Data_Common(); }
Expand All @@ -80,8 +80,8 @@ private :
void cLLI();
void cLLi() { cLLI(); }
void eXIf();
void fcTL() { Data_Common(); }
void fdAT() { Data_Common(); }
void fcTL();
void fdAT();
void gAMA();
void gdAT();
void gmAP();
Expand Down Expand Up @@ -111,9 +111,15 @@ private :
void Data_Common();

//Temp
int64u Data_Size;
int32u Signature;
int64u Data_Size{};
int32u Signature{};
std::shared_ptr<void> GainMap_metadata_ISO;
bool IDATseen{};
bool isAPNG{};
int32u framecount{};
float64 duration{};
float64 framerate_min{};
float64 framerate_max{};
};

} //NameSpace
Expand Down
3 changes: 2 additions & 1 deletion Source/MediaInfo/MediaInfo_Config_Automatic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1514,6 +1514,7 @@ void MediaInfo_Config_Format (InfoMap &Info)
"Wave;;;A;Riff;;act at9 wav;audio/vnd.wave\n"
"Wave64;;;A;Riff;;w64\n"
"WavPack;;;A;Wvpk;;wv wvc;;http://www.wavpack.com\n"
"APNG;;;I;Png;Animated Portable Network Graphic;apng png pns;image/apng;http://www.w3.org/TR/png/;Lossless\n"
"Arri Raw;;;I;ArriRaw;;ari\n"
"ARW;;;I;Tiff;Sony Alpha RAW;arw;image/x-sony-arw;http://www.sony.com/\n"
"Bitmap;;;I;Bmp;;bmp bms;image/bmp;;Lossless\n"
Expand All @@ -1533,7 +1534,7 @@ void MediaInfo_Config_Format (InfoMap &Info)
"NEF;;;I;Tiff;Nikon Electronic Format;nef;image/x-nikon-nef;http://www.nikon.com/\n"
"NRW;;;I;Tiff;Nikon RAW;nrw;image/x-nikon-nrw;http://www.nikon.com/\n"
"PCX;;;I;pcx;Personal Computer eXchange;pcx;image/pcx;;Lossless\n"
"PNG;;;I;Png;Portable Network Graphic;png pns;image/png;;Lossless\n"
"PNG;;;I;Png;Portable Network Graphic;png pns;image/png;http://www.w3.org/TR/png/;Lossless\n"
"PSD;;;I;Psd;Photoshop File Format;psd;image/psd;http://www.adobe.com/;Lossless\n"
"RIFF Palette;;;I;Riff;RIFF Palette\n"
"RLE;;;I;;Run-length encoding;rle\n"
Expand Down
3 changes: 2 additions & 1 deletion Source/Resource/Text/DataBase/Format.csv
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ Vorbis;;;A;;;;audio/vorbis;http://www.vorbis.com/;Lossy
Wave;;;A;Riff;;act at9 wav;audio/vnd.wave;;
Wave64;;;A;Riff;;w64;;;
WavPack;;;A;Wvpk;;wv wvc;;http://www.wavpack.com;
APNG;;;I;Png;Animated Portable Network Graphic;apng png pns;image/apng;http://www.w3.org/TR/png/;Lossless
Arri Raw;;;I;ArriRaw;;ari;;;
ARW;;;I;Tiff;Sony Alpha RAW;arw;image/x-sony-arw;http://www.sony.com/;
Bitmap;;;I;Bmp;;bmp bms;image/bmp;;Lossless
Expand All @@ -143,7 +144,7 @@ MNG;;;I;Mng;Multiple-Image Network Graphic;mng;;;Lossless
NEF;;;I;Tiff;Nikon Electronic Format;nef;image/x-nikon-nef;http://www.nikon.com/;
NRW;;;I;Tiff;Nikon RAW;nrw;image/x-nikon-nrw;http://www.nikon.com/;
PCX;;;I;pcx;Personal Computer eXchange;pcx;image/pcx;;Lossless
PNG;;;I;Png;Portable Network Graphic;png pns;image/png;;Lossless
PNG;;;I;Png;Portable Network Graphic;png pns;image/png;http://www.w3.org/TR/png/;Lossless
PSD;;;I;Psd;Photoshop File Format;psd;image/psd;http://www.adobe.com/;Lossless
RIFF Palette;;;I;Riff;RIFF Palette;;;;
RLE;;;I;;Run-length encoding;rle;;;
Expand Down