vendor: sync upstream change to support ID3v2.3 and .4 APIC
This commit is contained in:
		
							
								
								
									
										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);	//回到原位
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user