vendor: sync upstream change to support ID3v2.3 and .4 APIC

This commit is contained in:
Gary Wang 2021-01-29 12:51:56 +08:00
parent 636122c8c6
commit fcf965a9c2

View File

@ -4,7 +4,7 @@ ID3v2标签图片提取库 Ver 1.0
ID3v2标签中稳定便 ID3v2标签中稳定便
BMPJPEGPNGGIF图片格式 BMPJPEGPNGGIF图片格式
ShadowPower 2014/8/1 ShadowPower 2014/8/1
*/ */
#ifndef _ShadowPower_ID3V2PIC___ #ifndef _ShadowPower_ID3V2PIC___
@ -50,6 +50,17 @@ namespace spID3 {
int picLength = 0; //存放图片数据长度 int picLength = 0; //存放图片数据长度
char picFormat[4] = {}; //存放图片数据的格式(扩展名) 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数据返回值是否成功不是图片则失败 //检测图片格式参数1数据返回值是否成功不是图片则失败
bool verificationPictureFormat(char *data) bool verificationPictureFormat(char *data)
{ {
@ -157,7 +168,8 @@ namespace spID3 {
return false; //未发现图片数据 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); //向前跳跃到下一个帧头 fseek(fp, frameLength, SEEK_CUR); //向前跳跃到下一个帧头
memset(&id3v2fh, 0, 10); //清除帧头结构体数据 memset(&id3v2fh, 0, 10); //清除帧头结构体数据
fread(&id3v2fh, 10, 1, fp); //重新读取数据 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 ID3v2.3
@ -217,7 +229,7 @@ namespace spID3 {
} }
//跳过了Description文本以及末尾的\0 //跳过了Description文本以及末尾的\0
//非主流情况检测 //非主流情况检测+获得文件格式
memset(tempData, 0, 20); memset(tempData, 0, 20);
fread(&tempData, 8, 1, fp); fread(&tempData, 8, 1, fp);
fseek(fp, -8, SEEK_CUR); //回到原位 fseek(fp, -8, SEEK_CUR); //回到原位