vendor: sync upstream change to support ID3v2.3 and .4 APIC
This commit is contained in:
parent
636122c8c6
commit
fcf965a9c2
20
ID3v2Pic.h
20
ID3v2Pic.h
|
@ -4,7 +4,7 @@ ID3v2标签图片提取库 Ver 1.0
|
|||
从ID3v2标签中稳定、快捷、高效、便捷地提取出图片数据
|
||||
支持BMP、JPEG、PNG、GIF图片格式
|
||||
可将图片数据提取到文件或内存中,并能安全地释放内存
|
||||
ShadowPower 于2014/8/1
|
||||
ShadowPower 于2014/8/1 上午
|
||||
*/
|
||||
|
||||
#ifndef _ShadowPower_ID3V2PIC___
|
||||
|
@ -50,6 +50,17 @@ namespace spID3 {
|
|||
int picLength = 0; //存放图片数据长度
|
||||
char picFormat[4] = {}; //存放图片数据的格式(扩展名)
|
||||
|
||||
// ID3V2.3 & ID3V2.4 帧长度获取
|
||||
inline int _frameLength34(ID3V2FrameHeader* fh, byte majorVersion) {
|
||||
if (!fh || majorVersion < 3) {
|
||||
return 0;
|
||||
}
|
||||
if (majorVersion == 3) {
|
||||
return fh->size[0] * 0x1000000 + fh->size[1] * 0x10000 + fh->size[2] * 0x100 + fh->size[3];
|
||||
}
|
||||
return (fh->size[0] & 0x7f) * 0x200000 + (fh->size[1] & 0x7f) * 0x4000 + (fh->size[2] & 0x7f) * 0x80 + (fh->size[3] & 0x7f);
|
||||
}
|
||||
|
||||
//检测图片格式,参数1:数据,返回值:是否成功(不是图片则失败)
|
||||
bool verificationPictureFormat(char *data)
|
||||
{
|
||||
|
@ -157,7 +168,8 @@ namespace spID3 {
|
|||
return false; //未发现图片数据
|
||||
}
|
||||
//计算帧数据长度
|
||||
int frameLength = id3v2fh.size[0] * 0x1000000 + id3v2fh.size[1] * 0x10000 + id3v2fh.size[2] * 0x100 + id3v2fh.size[3];
|
||||
//使用int,不溢出的上限约2GB(标签帧没有这么大吧……)
|
||||
int frameLength = _frameLength34(&id3v2fh, id3v2h.major);
|
||||
fseek(fp, frameLength, SEEK_CUR); //向前跳跃到下一个帧头
|
||||
memset(&id3v2fh, 0, 10); //清除帧头结构体数据
|
||||
fread(&id3v2fh, 10, 1, fp); //重新读取数据
|
||||
|
@ -165,7 +177,7 @@ namespace spID3 {
|
|||
}
|
||||
|
||||
//计算一下当前图片帧的数据长度
|
||||
int frameLength = id3v2fh.size[0] * 0x1000000 + id3v2fh.size[1] * 0x10000 + id3v2fh.size[2] * 0x100 + id3v2fh.size[3];
|
||||
int frameLength = _frameLength34(&id3v2fh, id3v2h.major);
|
||||
|
||||
/*
|
||||
这是ID3v2.3图片帧的结构:
|
||||
|
@ -217,7 +229,7 @@ namespace spID3 {
|
|||
}
|
||||
//跳过了Description文本,以及末尾的\0
|
||||
|
||||
//非主流情况检测
|
||||
//非主流情况检测+获得文件格式
|
||||
memset(tempData, 0, 20);
|
||||
fread(&tempData, 8, 1, fp);
|
||||
fseek(fp, -8, SEEK_CUR); //回到原位
|
||||
|
|
Loading…
Reference in New Issue
Block a user