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标签中稳定、快捷、高效、便捷地提取出图片数据
|
从ID3v2标签中稳定、快捷、高效、便捷地提取出图片数据
|
||||||
支持BMP、JPEG、PNG、GIF图片格式
|
支持BMP、JPEG、PNG、GIF图片格式
|
||||||
可将图片数据提取到文件或内存中,并能安全地释放内存
|
可将图片数据提取到文件或内存中,并能安全地释放内存
|
||||||
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); //回到原位
|
||||||
|
|
Loading…
Reference in New Issue
Block a user