123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- #include <string.h>
- #include <memory.h>
- #include "id3_header_frame.h"
- #include "id3_error.h"
- bool ID3_FrameAttr::HasDataLength(int version)
- {
- if (version == 4)
- return !!(flags & ID3FL_DATA_LENGTH_2_4);
- else
- return 0;
- }
- bool ID3_FrameAttr::HasCompression(int version)
- {
- if (version == 4)
- return !!(flags & ID3FL_COMPRESSION_2_4);
- else
- return !!(flags & ID3FL_COMPRESSION_2_3);
- }
- bool ID3_FrameAttr::HasEncryption(int version)
- {
- if (version == 4)
- return !!(flags & ID3FL_ENCRYPTION_2_4);
- else
- return !!(flags & ID3FL_ENCRYPTION_2_3);
- }
- bool ID3_FrameAttr::HasGrouping(int version)
- {
- if (version == 4)
- return !!(flags & ID3FL_GROUPING_2_4);
- else
- return !!(flags & ID3FL_GROUPING_2_3);
- }
- bool ID3_FrameAttr::HasUnsync(int version)
- {
- if (version == 4)
- return !!(flags & ID3FL_UNSYNC_2_4);
- else
- return false;
- }
- void ID3_FrameAttr::ClearUnSync(int version)
- {
- if (version == 4)
- flags&= ~ID3FL_UNSYNC_2_4;
- }
- void ID3_FrameAttr::SetFlags(luint _flags)
- {
- flags = _flags;
- }
- void ID3_FrameHeader::SetFrameID (ID3_FrameID id)
- {
- frameID = id;
- }
- luint ID3_FrameHeader::Size(void)
- {
- if (!info)
- return 0;
- return info->frameIDBytes + info->frameSizeBytes + info->frameFlagsBytes;
- }
- luint ID3_FrameHeader::GetFrameInfo(ID3_FrameAttr &attr, const uchar *buffer, size_t remSize)
- {
- luint posn = 0;
- luint i = 0, bpos = 4;
-
- for (i = 0; i < 4; i++)
- {
- if (!((buffer[i] >= '0' && buffer[i] <= '9') || (buffer[i] >= 'A' && buffer[i] <= 'Z')))
- {
-
-
-
- bpos = i;
- }
- }
- memcpy(attr.textID, (char *) buffer, (bpos > 0 && bpos <= 4 ? bpos : 4));
- if (bpos == 3) attr.textID[3] = 0;
- attr.textID[4] = 0;
- posn += info->frameIDBytes;
- attr.size = 0;
- for (i = 0; i < info->frameSizeBytes; i++)
- attr.size |= buffer[posn + i] << ((info->frameSizeBytes - 1 - i) * 8);
- if (version == 4)
- {
-
-
- int mask = attr.size & 0x80808080;
- if (!quirks.id3v2_4_itunes_bug
- && mask == 0)
- {
- attr.size = int28().setFromFile(attr.size).get();
- }
- else
- {
-
-
- }
-
-
-
- }
- posn += info->frameSizeBytes;
- luint flags=0;
- flags = 0;
- for (i = 0; i < info->frameFlagsBytes; i++)
- flags |= buffer[ posn + i ] << ((info->frameFlagsBytes - 1 - i) * 8);
- attr.SetFlags(flags);
- posn += info->frameFlagsBytes;
- return posn;
- }
- luint ID3_FrameHeader::Render(uchar *buffer)
- {
- luint bytesUsed = 0;
- ID3_FrameDef *frameDef = NULL;
- char *textID = NULL;
- luint i;
- if (frameDef = ID3_FindFrameDef(frameID))
- {
- if (info->frameIDBytes < strlen (frameDef->longTextID))
- textID = frameDef->shortTextID;
- else
- textID = frameDef->longTextID;
- }
- else
- ID3_THROW (ID3E_InvalidFrameID);
- memcpy (&buffer[ bytesUsed ], (uchar *) textID, info->frameIDBytes);
- bytesUsed += info->frameIDBytes;
- for (i = 0; i < info->frameSizeBytes; i++)
- {
- if (version==4)
- buffer[ bytesUsed + i ] = (uchar) ((dataSize >> ((info->frameSizeBytes - i - 1) * 7)) & 0x7F);
- else
- buffer[ bytesUsed + i ] = (uchar) ((dataSize >> ((info->frameSizeBytes - i - 1) * 8)) & 0xFF);
- }
- bytesUsed += info->frameSizeBytes;
- for (i = 0; i < info->frameFlagsBytes; i++)
- buffer[ bytesUsed + i ] = (uchar) ((flags >> ((info->frameFlagsBytes - i - 1) * 8)) & 0xFF);
- bytesUsed += info->frameFlagsBytes;
- return bytesUsed;
- }
|