Guest User

Untitled

a guest
Mar 9th, 2015
444
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.93 KB | None | 0 0
  1. // вызов
  2. while (seek_pos < data_size) {
  3.     read = fread(&buff, 1, buff_size, fp);
  4.     // ...
  5.     for (pos = 0; pos < read; pos++, seek_pos++) {
  6.         // ...
  7.         if (mpeg_parse_frame(buff + pos, &header)) {
  8.  
  9.             // ... сохраняем значения в индекс
  10.  
  11.             pos += header.frame_size;
  12.             seek_pos += header.frame_size;
  13.         }
  14.     }
  15. }
  16.  
  17.  
  18.  
  19.  
  20. // реализация
  21. static unsigned
  22. mpeg_parse_frame(
  23.     const unsigned char *buff,
  24.     mpeg_header_t *const header
  25. )
  26. {
  27.     unsigned  header_bitrate;
  28.     unsigned  header_samplerate;
  29.     char     *xing;
  30.  
  31.     // check sync
  32.     if (buff[0] != 0xff || buff[1] < 0xe0) {
  33.         return 0;
  34.     }
  35.     // get and check version
  36.     switch (buff[1] >> 3 & 0x03) {
  37.         case 3: // MPEG Version 1
  38.             header->version = 0;
  39.         break;
  40.         case 2: // MPEG Version 2
  41.             header->version = 1;
  42.         break;
  43.         case 0: // MPEG Version 2.5
  44.             header->version = 2;
  45.         break;
  46.         default:
  47.             return 0;
  48.         break;
  49.     }
  50.     // get and check layer
  51.     header->layer = 3 - (buff[1] >> 1 & 0x03);
  52.     if (header->layer == 3) {
  53.         return 0;
  54.     }
  55.     // get and check bitrate
  56.     header_bitrate = buff[2] >> 4;
  57.     if (header_bitrate == 0x0f) {
  58.         return 0;
  59.     }
  60.     // get and check samplerate
  61.     header_samplerate = buff[2] >> 2 & 0x03;
  62.     if (header_samplerate == 0x03) {
  63.         return 0;
  64.     }
  65.     // get bitrate value
  66.     if (header->version == 1) {
  67.         header->bitrate = mpeg_kbps[1][header->layer][header_bitrate];
  68.     } else {
  69.         header->bitrate = mpeg_kbps[0][header->layer][header_bitrate];
  70.     }
  71.     if (!header->bitrate) {
  72.         return 0;
  73.     }
  74.     // get samplerate value
  75.     header->samplerate = mpeg_freq[header->version][header_samplerate];
  76.     // get number of PCM samples
  77.     header->samples = mpeg_pcm_samples[header->version][header->layer];
  78.     // get padding bit
  79.     header->padding_bit = buff[2] >> 1 & 0x01;
  80.     // get channel mode
  81.     header->mode = buff[3] >> 6 & 0x03;
  82.     // get VBR
  83.     header->vbr = 0; // none
  84.     xing = (char *) (buff + (
  85.         !header->version
  86.             ? (header->mode < 3 ? 32 : 17) // MPEG-1
  87.             : (header->mode < 3 ? 17 :  9) // MPEG-2 LSF, MPEG-2.5
  88.     ));
  89.     if (!strncmp(xing, "Xing", 4) || !strncmp(xing, "Info", 4)) {
  90.         header->vbr = 1; // xing
  91.     } else if (!strncmp((char *) (buff + 32), "VBRI", 4)) {
  92.         header->vbr = 2; // vbri
  93.     }
  94.  
  95.     // TODO frame size for VBR is incorrect
  96.     if (!header->layer) {
  97.         header->frame_size = (size_t) (((12000 * header->bitrate / header->samplerate) + header->padding_bit) * 4);
  98.     } else {
  99.         header->frame_size = (size_t) ((144000 * header->bitrate / header->samplerate) + header->padding_bit);
  100.     }
  101.     if (!header->frame_size) {
  102.         //return 0; TODO free format
  103.     }
  104.  
  105.     return 1;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment