ttadec.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:18k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * ttadec.c
  3.  *
  4.  * Description:  TTAv1 decoder library for HW players
  5.  * Developed by: Alexander Djourik <ald@true-audio.com>
  6.  *               Pavel Zhilin <pzh@true-audio.com>
  7.  *
  8.  * Copyright (c) 2004 True Audio Software. All rights reserved.
  9.  *
  10.  */
  11. /*
  12.  * Redistribution and use in source and binary forms, with or without
  13.  * modification, are permitted provided that the following conditions
  14.  * are met:
  15.  *
  16.  * 1. Redistributions of source code must retain the above copyright
  17.  *    notice, this list of conditions and the following disclaimer.
  18.  * 2. Redistributions in binary form must reproduce the above copyright
  19.  *    notice, this list of conditions and the following disclaimer in the
  20.  *    documentation and/or other materials provided with the distribution.
  21.  * 3. Neither the name of the True Audio Software nor the names of its
  22.  *    contributors may be used to endorse or promote products derived
  23.  *    from this software without specific prior written permission.
  24.  *
  25.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  26.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  27.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  28.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  29.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  30.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  31.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  32.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  33.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  34.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  35.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36.  */
  37. #include <stdlib.h>
  38. #include <string.h>
  39. #include "ttalib.h"
  40. #include "ttadec.h"
  41. #include "filter.h"
  42. /******************* static variables and structures *******************/
  43. static unsigned char isobuffers[ISO_BUFFERS_SIZE + 4];
  44. static unsigned char *iso_buffers_end = isobuffers + ISO_BUFFERS_SIZE;
  45. static unsigned int pcm_buffer_size;
  46. static decoder tta[MAX_NCH]; // decoder state
  47. static int cache[MAX_NCH]; // decoder cache
  48. tta_info *ttainfo; // currently playing file info
  49. static unsigned int fframes; // number of frames in file
  50. static unsigned int framelen; // the frame length in samples
  51. static unsigned int lastlen; // the length of the last frame in samples
  52. static unsigned int data_pos; // currently playing frame index
  53. static unsigned int data_cur; // the playing position in frame
  54. static int maxvalue; // output data max value
  55. static unsigned int *seek_table; // the playing position table
  56. static unsigned int st_state; //seek table status
  57. static unsigned int frame_crc32;
  58. static unsigned int bit_count;
  59. static unsigned int bit_cache;
  60. static unsigned char *bitpos;
  61. static int read_id3_tags (tta_info *info);
  62. /************************* crc32 functions *****************************/
  63. #define UPDATE_CRC32(x, crc) crc = 
  64. (((crc>>8) & 0x00FFFFFF) ^ crc32_table[(crc^x) & 0xFF])
  65. static unsigned int 
  66. crc32 (unsigned char *buffer, unsigned int len) {
  67. unsigned int i;
  68. unsigned int crc = 0xFFFFFFFF;
  69. for (i = 0; i < len; i++) UPDATE_CRC32(buffer[i], crc);
  70. return (crc ^ 0xFFFFFFFF);
  71. }
  72. /************************* bit operations ******************************/
  73. #define GET_BINARY(value, bits) 
  74. while (bit_count < bits) { 
  75. if (bitpos == iso_buffers_end) { 
  76. if (!ttainfo->Reader->Read(ttainfo->Reader, isobuffers, 
  77.     ISO_BUFFERS_SIZE)) { 
  78.     ttainfo->STATE = READ_ERROR; 
  79.     return -1; } 
  80. bitpos = isobuffers; } 
  81. UPDATE_CRC32(*bitpos, frame_crc32); 
  82. bit_cache |= *bitpos << bit_count; 
  83. bit_count += 8; 
  84. bitpos++; } 
  85. value = bit_cache & bit_mask[bits]; 
  86. bit_cache >>= bits; 
  87. bit_count -= bits; 
  88. bit_cache &= bit_mask[bit_count];
  89. #define GET_UNARY(value) 
  90. value = 0; 
  91. while (!(bit_cache ^ bit_mask[bit_count])) { 
  92. if (bitpos == iso_buffers_end) { 
  93. if (!ttainfo->Reader->Read(ttainfo->Reader, isobuffers, 
  94.     ISO_BUFFERS_SIZE)) { 
  95.     ttainfo->STATE = READ_ERROR; 
  96.     return -1; } 
  97. bitpos = isobuffers; } 
  98. value += bit_count; 
  99. bit_cache = *bitpos++; 
  100. UPDATE_CRC32(bit_cache, frame_crc32); 
  101. bit_count = 8; } 
  102. while (bit_cache & 1) { 
  103. value++; 
  104. bit_cache >>= 1; 
  105. bit_count--; } 
  106. bit_cache >>= 1; 
  107. bit_count--;
  108. static void init_buffer_read() {
  109. frame_crc32 = 0xFFFFFFFFUL;
  110. bit_count = bit_cache = 0;
  111. bitpos = iso_buffers_end;
  112. }
  113. static int done_buffer_read() {
  114. unsigned int crc32, rbytes;
  115. frame_crc32 ^= 0xFFFFFFFFUL;
  116. rbytes = iso_buffers_end - bitpos;
  117. if (rbytes < sizeof(int)) {
  118.     memcpy(isobuffers, bitpos, 4);
  119.     if (!ttainfo->Reader->Read(ttainfo->Reader, isobuffers + rbytes,
  120. ISO_BUFFERS_SIZE - rbytes))
  121. return -1;
  122.     bitpos = isobuffers;
  123. }
  124. memcpy(&crc32, bitpos, 4);
  125. crc32 = ENDSWAP_INT32(crc32);
  126. bitpos += sizeof(int);
  127.     
  128. if (crc32 != frame_crc32) return -1;
  129. bit_cache = bit_count = 0;
  130. frame_crc32 = 0xFFFFFFFFUL;
  131. return 0;
  132. }
  133. /************************* decoder functions ****************************/
  134. const char *get_error_str (int error) {
  135. switch (error) {
  136. case NO_ERROR:      return "No errors found";
  137. case OPEN_ERROR:    return "Can't open file";
  138. case FORMAT_ERROR:  return "Not supported file format";
  139. case FILE_ERROR:    return "File is corrupted";
  140. case READ_ERROR:    return "Can't read from file";
  141. case MEMORY_ERROR:  return "Insufficient memory available";
  142. default:            return "Unknown error code";
  143. }
  144. }
  145. int open_tta_file (tta_info *info, unsigned int data_offset) {
  146. unsigned int checksum;
  147. unsigned int datasize;
  148. unsigned int origsize;
  149. tta_hdr ttahdr;
  150. // clear the memory
  151. //memset (info, 0, sizeof(tta_info));
  152. // get file size
  153. info->Reader->Seek(info->Reader, 0, SEEK_END);
  154. info->FILESIZE = info->Reader->FilePos;
  155. info->Reader->Seek(info->Reader, 0, SEEK_SET);
  156. // read id3 tags
  157. if (!data_offset) {
  158. // if ((data_offset = skip_id3_tag (info)) < 0) {
  159. if ((data_offset = read_id3_tags (info)) < 0) {
  160.     return -1;
  161. }
  162. } else info->Reader->Seek(info->Reader, data_offset, SEEK_SET);
  163. // read TTA header
  164. if (info->Reader->Read(info->Reader, &ttahdr, sizeof (ttahdr)) == 0) {
  165. info->STATE = READ_ERROR;
  166. return -1;
  167. }
  168. // check for TTA3 signature
  169. if (ENDSWAP_INT32(ttahdr.TTAid) != TTA1_SIGN) {
  170. info->STATE = FORMAT_ERROR;
  171. return -1;
  172. }
  173. ttahdr.CRC32 = ENDSWAP_INT32(ttahdr.CRC32);
  174. checksum = crc32((unsigned char *) &ttahdr,
  175. sizeof(tta_hdr) - sizeof(int));
  176. if (checksum != ttahdr.CRC32) {
  177. info->STATE = FILE_ERROR;
  178. return -1;
  179. }
  180. ttahdr.AudioFormat = ENDSWAP_INT16(ttahdr.AudioFormat);
  181. ttahdr.NumChannels = ENDSWAP_INT16(ttahdr.NumChannels);
  182. ttahdr.BitsPerSample = ENDSWAP_INT16(ttahdr.BitsPerSample);
  183. ttahdr.SampleRate = ENDSWAP_INT32(ttahdr.SampleRate);
  184. ttahdr.DataLength = ENDSWAP_INT32(ttahdr.DataLength);
  185. // check for player supported formats
  186. if (ttahdr.AudioFormat != WAVE_FORMAT_PCM ||
  187. ttahdr.NumChannels > MAX_NCH ||
  188. ttahdr.BitsPerSample > MAX_BPS ||(
  189. ttahdr.SampleRate != 16000 &&
  190. ttahdr.SampleRate != 22050 &&
  191. ttahdr.SampleRate != 24000 &&
  192. ttahdr.SampleRate != 32000 &&
  193. ttahdr.SampleRate != 44100 &&
  194. ttahdr.SampleRate != 48000 &&
  195. ttahdr.SampleRate != 64000 &&
  196. ttahdr.SampleRate != 88200 &&
  197. ttahdr.SampleRate != 96000)) {
  198. info->STATE = FORMAT_ERROR;
  199. return -1;
  200. }
  201. // fill the File Info
  202. info->NCH = ttahdr.NumChannels;
  203. info->BPS = ttahdr.BitsPerSample;
  204. info->BSIZE = (ttahdr.BitsPerSample + 7)/8;
  205. info->FORMAT = ttahdr.AudioFormat;
  206. info->SAMPLERATE = ttahdr.SampleRate;
  207. info->DATALENGTH = ttahdr.DataLength;
  208. info->FRAMELEN = (int) (FRAME_TIME * ttahdr.SampleRate);
  209. info->LENGTH = ttahdr.DataLength / ttahdr.SampleRate;
  210. info->DATAPOS = data_offset;
  211.         datasize = info->FILESIZE - info->DATAPOS;
  212.         origsize = info->DATALENGTH * info->BSIZE * info->NCH;
  213. info->COMPRESS = (double) datasize / origsize;
  214. info->BITRATE = (int) (info->COMPRESS * info->SAMPLERATE *
  215. info->NCH * info->BPS / 1000);
  216. return 0;
  217. }
  218. static void rice_init(adapt *rice, unsigned int k0, unsigned int k1) {
  219. rice->k0 = k0;
  220. rice->k1 = k1;
  221. rice->sum0 = shift_16[k0];
  222. rice->sum1 = shift_16[k1];
  223. }
  224. static void decoder_init(decoder *tta, int nch, int byte_size) {
  225. int shift = flt_set[byte_size - 1];
  226. int i;
  227. for (i = 0; i < nch; i++) {
  228. filter_init(&tta[i].fst, shift);
  229. rice_init(&tta[i].rice, 10, 10);
  230. tta[i].last = 0;
  231. }
  232. }
  233. static void seek_table_init (unsigned int *seek_table,
  234. unsigned int len, unsigned int data_offset) {
  235. unsigned int *st, frame_len;
  236. for (st = seek_table; st < (seek_table + len); st++) {
  237. frame_len = ENDSWAP_INT32(*st);
  238. *st = data_offset;
  239. data_offset += frame_len;
  240. }
  241. }
  242. int set_position (unsigned int pos) {
  243. unsigned int seek_pos;
  244. if (pos >= fframes) return 0;
  245. if (!st_state) {
  246. ttainfo->STATE = FILE_ERROR;
  247. return -1;
  248. }
  249. seek_pos = ttainfo->DATAPOS + seek_table[data_pos = pos];
  250. if (ttainfo->Reader->Seek(ttainfo->Reader, seek_pos, SEEK_SET) < 0) {
  251. ttainfo->STATE = READ_ERROR;
  252. return -1;
  253. }
  254. data_cur = 0;
  255. framelen = 0;
  256. // init bit reader
  257. init_buffer_read();
  258. return 0;
  259. }
  260. int player_init (tta_info *info) {
  261. unsigned int checksum;
  262. unsigned int data_offset;
  263. unsigned int st_size;
  264. ttainfo = info;
  265. framelen = 0;
  266. data_pos = 0;
  267. data_cur = 0;
  268. lastlen = ttainfo->DATALENGTH % ttainfo->FRAMELEN;
  269. fframes = ttainfo->DATALENGTH / ttainfo->FRAMELEN + (lastlen ? 1 : 0);
  270. st_size = (fframes + 1) * sizeof(int);
  271. seek_table = (unsigned int *) malloc(st_size);
  272. if (!seek_table) {
  273. ttainfo->STATE = MEMORY_ERROR;
  274. return -1;
  275. }
  276. // read seek table
  277. if (!info->Reader->Read(info->Reader, seek_table, st_size)) {
  278. ttainfo->STATE = READ_ERROR;
  279. return -1;
  280. }
  281. checksum = crc32((unsigned char *) seek_table, st_size - sizeof(int));
  282. st_state = (checksum == ENDSWAP_INT32(seek_table[fframes]));
  283. data_offset = sizeof(tta_hdr) + st_size;
  284. // init seek table
  285. seek_table_init(seek_table, fframes, data_offset);
  286. // init bit reader
  287. init_buffer_read();
  288. pcm_buffer_size = PCM_BUFFER_LENGTH * ttainfo->BSIZE * ttainfo->NCH;
  289. maxvalue = (1UL << ttainfo->BPS) - 1;
  290. return 0;
  291. }
  292. void close_tta_file (tta_info *info) {
  293. }
  294. void player_stop () {
  295. if (seek_table) {
  296. free(seek_table);
  297. seek_table = NULL;
  298. }
  299. }
  300. int get_samples (byte *buffer) {
  301. unsigned int k, depth, unary, binary;
  302. byte *p = buffer;
  303. decoder *dec = tta;
  304. int *prev = cache;
  305. int value, res;
  306. for (res = 0; p < buffer + pcm_buffer_size;) {
  307. fltst *fst = &dec->fst;
  308. adapt *rice = &dec->rice;
  309. int *last = &dec->last;
  310. if (data_cur == framelen) {
  311. if (data_pos == fframes) break;
  312. if (framelen && done_buffer_read()) {
  313.     if (set_position(data_pos)) return -1;
  314.     if (res) break;
  315. }
  316. if (data_pos == fframes - 1 && lastlen)
  317. framelen = lastlen;
  318. else framelen = ttainfo->FRAMELEN;
  319. decoder_init(tta, ttainfo->NCH, ttainfo->BSIZE);
  320. data_pos++; data_cur = 0;
  321. }
  322. // decode Rice unsigned
  323. GET_UNARY(unary);
  324. switch (unary) {
  325. case 0: depth = 0; k = rice->k0; break;
  326. default:
  327. depth = 1; k = rice->k1;
  328. unary--;
  329. }
  330. if (k) {
  331. GET_BINARY(binary, k);
  332. value = (unary << k) + binary;
  333. } else value = unary;
  334. switch (depth) {
  335. case 1: 
  336. rice->sum1 += value - (rice->sum1 >> 4);
  337. if (rice->k1 > 0 && rice->sum1 < shift_16[rice->k1])
  338. rice->k1--;
  339. else if (rice->sum1 > shift_16[rice->k1 + 1])
  340. rice->k1++;
  341. value += bit_shift[rice->k0];
  342. default:
  343. rice->sum0 += value - (rice->sum0 >> 4);
  344. if (rice->k0 > 0 && rice->sum0 < shift_16[rice->k0])
  345. rice->k0--;
  346. else if (rice->sum0 > shift_16[rice->k0 + 1])
  347. rice->k0++;
  348. }
  349. value = DEC(value);
  350. // decompress stage 1: adaptive hybrid filter
  351. hybrid_filter(fst, &value);
  352. // decompress stage 2: fixed order 1 prediction
  353. switch (ttainfo->BSIZE) {
  354. case 1: value += PREDICTOR1(*last, 4); break; // bps 8
  355. case 2: value += PREDICTOR1(*last, 5); break; // bps 16
  356. case 3: value += PREDICTOR1(*last, 5); break; // bps 24
  357. } *last = value;
  358. // check for errors
  359. if (abs(value) > maxvalue) {
  360. unsigned int tail =
  361. pcm_buffer_size / (ttainfo->BSIZE * ttainfo->NCH) - res;
  362. memset(buffer, 0, pcm_buffer_size);
  363. data_cur += tail; res += tail;
  364. break;
  365. }
  366. if (dec < tta + (ttainfo->NCH - 1)) {
  367. *prev++ = value; dec++;
  368. } else {
  369. *prev = value;
  370. if (ttainfo->NCH > 1) {
  371. int *r = prev - 1;
  372. for (*prev += *r/2; r >= cache; r--)
  373. *r = *(r + 1) - *r;
  374. for (r = cache; r < prev; r++)
  375. WRITE_BUFFER(r, ttainfo->BSIZE, p)
  376. }
  377. WRITE_BUFFER(prev, ttainfo->BSIZE, p)
  378. prev = cache;
  379. data_cur++; res++;
  380. dec = tta;
  381. }
  382. }
  383. return res;
  384. }
  385. /*
  386.  * Description:  ID3 tags manipulation routines
  387.  *               Provides read access to ID3 tags v1.1, v2.3.x, v2.4.x
  388.  *               Supported ID3v2 frames: Title, Artist, Album, Track,
  389.  *               Year, Genre, Comment.
  390.  *
  391.  * Copyright (c) 2004 Alexander Djourik. All rights reserved.
  392.  *
  393.  */
  394. static unsigned int unpack_sint28 (const char *ptr) {
  395. unsigned int value = 0;
  396. if (ptr[0] & 0x80) return 0;
  397. value =  value       | (ptr[0] & 0x7f);
  398. value = (value << 7) | (ptr[1] & 0x7f);
  399. value = (value << 7) | (ptr[2] & 0x7f);
  400. value = (value << 7) | (ptr[3] & 0x7f);
  401. return value;
  402. }
  403. static unsigned int unpack_sint32 (const char *ptr) {
  404. unsigned int value = 0;
  405. if (ptr[0] & 0x80) return 0;
  406. value = (value << 8) | ptr[0];
  407. value = (value << 8) | ptr[1];
  408. value = (value << 8) | ptr[2];
  409. value = (value << 8) | ptr[3];
  410. return value;
  411. }
  412. static int get_frame_id (const char *id) {
  413. if (!memcmp(id, "TIT2", 4)) return TIT2; // Title
  414. if (!memcmp(id, "TPE1", 4)) return TPE1; // Artist
  415. if (!memcmp(id, "TALB", 4)) return TALB; // Album
  416. if (!memcmp(id, "TRCK", 4)) return TRCK; // Track
  417. if (!memcmp(id, "TYER", 4)) return TYER; // Year
  418. if (!memcmp(id, "TCON", 4)) return TCON; // Genre
  419. if (!memcmp(id, "COMM", 4)) return COMM; // Comment
  420. return 0;
  421. }
  422. #if 0
  423. static int skip_id3_tag (tta_info *info) {
  424. id3v2_tag id3v2;
  425. int id3v2_size;
  426. ////////////////////////////////////////
  427. // skip ID3v2 tag
  428. if (!info->Reader->Read(info->Reader, &id3v2, sizeof(id3v2_tag)))
  429. goto read_error;
  430. if (memcmp(id3v2.id, "ID3", 3)) {
  431. if (info->Reader->Seek(info->Reader, 0, SEEK_SET) < 0)
  432.     goto read_error;
  433. return 0;
  434. }
  435. if (id3v2.size[0] & 0x80) goto file_error;
  436. id3v2_size = unpack_sint28(id3v2.size);
  437. id3v2_size += (id3v2.flags &
  438. ID3_FOOTERPRESENT_FLAG) ? 20 : 10;
  439. info->Reader->Seek(info->Reader, id3v2_size, SEEK_SET);
  440. info->ID3.size = id3v2_size;
  441. return id3v2_size;
  442. file_error:
  443. ttainfo->STATE = FILE_ERROR;
  444. return -1;
  445. read_error:
  446. ttainfo->STATE = READ_ERROR;
  447. return -1;
  448. }
  449. #endif
  450. static int read_id3_tags (tta_info *info) {
  451. id3v1_tag id3v1;
  452. id3v2_tag id3v2;
  453. id3v2_frame frame_header;
  454. int id3v2_size;
  455. char *buffer = NULL;
  456. char *ptr;
  457. ////////////////////////////////////////
  458. // ID3v1 support
  459. if (info->Reader->Seek(info->Reader, -(int) sizeof(id3v1_tag),
  460. SEEK_END) < 0) goto read_error;
  461. if (!info->Reader->Read(info->Reader, &id3v1, sizeof(id3v1_tag))) 
  462.     goto read_error;
  463. if (!memcmp (id3v1.id, "TAG", 3)) {
  464. memcpy(info->ID3.title, id3v1.title, 30);
  465. memcpy(info->ID3.artist, id3v1.artist, 30);
  466. memcpy(info->ID3.album, id3v1.album, 30);
  467. memcpy(info->ID3.year, id3v1.year, 4);
  468. memcpy(info->ID3.comment, id3v1.comment, 28);
  469. if (id3v1.genre > GENRES-1) id3v1.genre = 12;
  470. sprintf(info->ID3.track, "%02d", id3v1.track);
  471. if (id3v1.genre && id3v1.genre != 0xFF)
  472.     sprintf(info->ID3.genre, "%s", genre[id3v1.genre]);
  473. info->ID3.id3has |= 1;
  474. }
  475. if (info->Reader->Seek(info->Reader, 0, SEEK_SET) < 0)
  476. goto read_error;
  477. ////////////////////////////////////////
  478. // ID3v2 minimal support
  479. if (!info->Reader->Read(info->Reader, &id3v2, sizeof(id3v2_tag)))
  480. goto read_error;
  481. if (memcmp(id3v2.id, "ID3", 3)) {
  482. if (info->Reader->Seek(info->Reader, 0, SEEK_SET) < 0)
  483.     goto read_error;
  484. return 0;
  485. }
  486. if (id3v2.size[0] & 0x80) goto file_error;
  487. id3v2_size = unpack_sint28(id3v2.size);
  488. if (!(buffer = (unsigned char *) malloc (id3v2_size))) {
  489. ttainfo->STATE = MEMORY_ERROR;
  490. goto read_done;
  491. }
  492. if ((id3v2.flags & ID3_UNSYNCHRONISATION_FLAG) ||
  493. (id3v2.flags & ID3_EXPERIMENTALTAG_FLAG) ||
  494. (id3v2.version < 3)) goto read_done;
  495. if (!info->Reader->Read(info->Reader, buffer, id3v2_size)) {
  496. free (buffer);
  497. goto read_error;
  498. }
  499. ptr = buffer;
  500. // skip extended header if present
  501. if (id3v2.flags & ID3_EXTENDEDHEADER_FLAG) {
  502. int offset = unpack_sint32(ptr);
  503. ptr += offset;
  504. }
  505. // read id3v2 frames
  506. while (ptr - buffer < id3v2_size) {
  507. char *data = NULL;
  508. int data_size, frame_id;
  509. int size = 0;
  510. // get frame header
  511. memcpy(&frame_header, ptr, sizeof(id3v2_frame));
  512. ptr += sizeof(id3v2_frame);
  513. data_size = unpack_sint32(frame_header.size);
  514. // skip unsupported frames
  515. if (!(frame_id = get_frame_id(frame_header.id)) ||
  516. frame_header.flags & FRAME_COMPRESSION_FLAG ||
  517. frame_header.flags & FRAME_ENCRYPTION_FLAG ||
  518. frame_header.flags & FRAME_UNSYNCHRONISATION_FLAG || (
  519. *ptr != FIELD_TEXT_ISO_8859_1 &&
  520. *ptr != FIELD_TEXT_UTF_8)) {
  521. ptr += data_size;
  522. continue;
  523. }
  524. data_size--; ptr++;
  525. switch (frame_id) {
  526. case TIT2: data = info->ID3.title;
  527. size = sizeof(info->ID3.title) - 1; break;
  528. case TPE1: data = info->ID3.artist;
  529. size = sizeof(info->ID3.artist) - 1; break;
  530. case TALB: data = info->ID3.album;
  531. size = sizeof(info->ID3.album) - 1; break;
  532. case TRCK: data = info->ID3.track;
  533. size = sizeof(info->ID3.track) - 1; break;
  534. case TYER: data = info->ID3.year;
  535. size = sizeof(info->ID3.year) - 1; break;
  536. case TCON: data = info->ID3.genre;
  537. size = sizeof(info->ID3.genre) - 1; break;
  538. case COMM: data = info->ID3.comment;
  539. size = sizeof(info->ID3.comment) - 1;
  540. data_size -= 3; ptr += 3;
  541. // skip zero short description
  542. if (*ptr == 0) { data_size--; ptr++; }
  543. break;
  544. }
  545. if (data_size < size) size = data_size;
  546. memcpy(data, ptr, size); data[size] = '';
  547. ptr += data_size;
  548. }
  549. info->ID3.id3has |= 2;
  550. read_done:
  551. if (buffer) free(buffer);
  552. id3v2_size += (id3v2.flags &
  553. ID3_FOOTERPRESENT_FLAG) ? 20 : 10;
  554. info->Reader->Seek(info->Reader, id3v2_size, SEEK_SET);
  555. info->ID3.size = id3v2_size;
  556. return id3v2_size;
  557. file_error:
  558. ttainfo->STATE = FILE_ERROR;
  559. return -1;
  560. read_error:
  561. ttainfo->STATE = READ_ERROR;
  562. return -1;
  563. }
  564. /* eof */