mpeg3atrack.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "libmpeg3.h"
  2. #include "mpeg3protos.h"
  3. #include "mpeg3demux.h"
  4. #include "mp4av.h"
  5. #include <stdlib.h>
  6. static int mpeg3_atrack_get_mp3_info (mpeg3_atrack_t *atrack)
  7. {
  8.   uint8_t hdr[4];
  9.   mpeg3_demuxer_t *demux;
  10.   MP4AV_Mp3Header temp;
  11.   demux = atrack->demuxer;
  12.   hdr[1] = mpeg3demux_read_char(demux);
  13.   do {
  14.     hdr[0] = hdr[1];
  15.     hdr[1] = mpeg3demux_read_char(demux);
  16.   } while (((hdr[0] != 0xff) || 
  17.    ((hdr[1] & 0xe0) != 0xe0)) && 
  18.    !mpeg3demux_eof(demux));
  19.   
  20.   if (mpeg3demux_eof(demux)) return -1;
  21.   hdr[2] = mpeg3demux_read_char(demux);
  22.   hdr[3] = mpeg3demux_read_char(demux);
  23.   temp = MP4AV_Mp3HeaderFromBytes(hdr);
  24.   atrack->sample_rate = MP4AV_Mp3GetHdrSamplingRate(temp);
  25.   atrack->channels = MP4AV_Mp3GetChannels(temp);
  26.   atrack->samples_per_frame = MP4AV_Mp3GetHdrSamplingWindow(temp);
  27.   return 0;
  28. }
  29. static int mpeg3_atrack_get_aac_info (mpeg3_atrack_t *atrack)
  30. {
  31.   uint8_t hdr[16];
  32.   mpeg3_demuxer_t *demux;
  33.   uint16_t hdr_size;
  34.   uint16_t ix;
  35.   demux = atrack->demuxer;
  36.   hdr[1] = mpeg3demux_read_char(demux);
  37.   do {
  38.     hdr[0] = hdr[1];
  39.     hdr[1] = mpeg3demux_read_char(demux);
  40.   } while (((hdr[0] != 0xff) || 
  41.    ((hdr[1] & 0xf0) != 0xf0)) && 
  42.    !mpeg3demux_eof(demux));
  43.   if (mpeg3demux_eof(demux)) return -1;
  44.   hdr_size = MP4AV_AdtsGetHeaderByteSize(hdr);
  45.   if (hdr_size > sizeof(hdr)) return -1;
  46.   for (ix = 2; ix < hdr_size; ix++) {
  47.     hdr[ix] = mpeg3demux_read_char(demux);
  48.   }
  49.   if (mpeg3demux_eof(demux)) return -1;
  50.   
  51.   atrack->sample_rate = MP4AV_AdtsGetSamplingRate(hdr);
  52.   atrack->channels = MP4AV_AdtsGetChannels(hdr);
  53.   atrack->samples_per_frame = 1024; // always the same
  54.   
  55.   return 0;
  56. }
  57. static int mpeg3_ac3_samplerates[] = { 48000, 44100, 32000 };
  58. struct mpeg3_framesize_s
  59. {
  60. unsigned short bit_rate;
  61. unsigned short frm_size[3];
  62. };
  63. static struct mpeg3_framesize_s framesize_codes[] = 
  64. {
  65.       { 32  ,{64   ,69   ,96   } },
  66.       { 32  ,{64   ,70   ,96   } },
  67.       { 40  ,{80   ,87   ,120  } },
  68.       { 40  ,{80   ,88   ,120  } },
  69.       { 48  ,{96   ,104  ,144  } },
  70.       { 48  ,{96   ,105  ,144  } },
  71.       { 56  ,{112  ,121  ,168  } },
  72.       { 56  ,{112  ,122  ,168  } },
  73.       { 64  ,{128  ,139  ,192  } },
  74.       { 64  ,{128  ,140  ,192  } },
  75.       { 80  ,{160  ,174  ,240  } },
  76.       { 80  ,{160  ,175  ,240  } },
  77.       { 96  ,{192  ,208  ,288  } },
  78.       { 96  ,{192  ,209  ,288  } },
  79.       { 112 ,{224  ,243  ,336  } },
  80.       { 112 ,{224  ,244  ,336  } },
  81.       { 128 ,{256  ,278  ,384  } },
  82.       { 128 ,{256  ,279  ,384  } },
  83.       { 160 ,{320  ,348  ,480  } },
  84.       { 160 ,{320  ,349  ,480  } },
  85.       { 192 ,{384  ,417  ,576  } },
  86.       { 192 ,{384  ,418  ,576  } },
  87.       { 224 ,{448  ,487  ,672  } },
  88.       { 224 ,{448  ,488  ,672  } },
  89.       { 256 ,{512  ,557  ,768  } },
  90.       { 256 ,{512  ,558  ,768  } },
  91.       { 320 ,{640  ,696  ,960  } },
  92.       { 320 ,{640  ,697  ,960  } },
  93.       { 384 ,{768  ,835  ,1152 } },
  94.       { 384 ,{768  ,836  ,1152 } },
  95.       { 448 ,{896  ,975  ,1344 } },
  96.       { 448 ,{896  ,976  ,1344 } },
  97.       { 512 ,{1024 ,1114 ,1536 } },
  98.       { 512 ,{1024 ,1115 ,1536 } },
  99.       { 576 ,{1152 ,1253 ,1728 } },
  100.       { 576 ,{1152 ,1254 ,1728 } },
  101.       { 640 ,{1280 ,1393 ,1920 } },
  102.       { 640 ,{1280 ,1394 ,1920 } }
  103. };
  104. /* Audio channel modes */
  105. static short mpeg3_ac3_acmodes[] = {2, 1, 2, 3, 3, 4, 4, 5};
  106. static int mpeg3_atrack_get_ac3_info (mpeg3_atrack_t *atrack)
  107. {
  108.   uint16_t code, mask;
  109.   unsigned int sampling_freq_code, framesize_code;
  110.   unsigned int acmod;
  111.   unsigned int skipbits;
  112.   mpeg3_demuxer_t *demux;
  113.   demux = atrack->demuxer;
  114.   code = mpeg3demux_read_char(demux);
  115.   do {
  116.     code &= 0xff;
  117.     code <<= 8;
  118.     code |= mpeg3demux_read_char(demux);
  119.   } while (!mpeg3demux_eof(demux) && code != MPEG3_AC3_START_CODE);
  120.   if (mpeg3demux_eof(demux)) return -1;
  121.   
  122.   // 2 bytes CRC
  123.   mpeg3demux_read_char(demux);
  124.   mpeg3demux_read_char(demux);
  125.   
  126.   code = mpeg3demux_read_char(demux);
  127.   sampling_freq_code = (code >> 6) & 0x3;
  128.   framesize_code = code & 0x3f;
  129.   // bsid and bsmod
  130.   mpeg3demux_read_char(demux);
  131.   // acmod is 3 bits
  132.   code = mpeg3demux_read_char(demux) << 8;
  133.   code |= mpeg3demux_read_char(demux);
  134.   if (mpeg3demux_eof(demux)) return -1;
  135.   atrack->sample_rate = 
  136.     mpeg3_ac3_samplerates[sampling_freq_code];
  137.   atrack->framesize = 
  138.     2 * framesize_codes[framesize_code].frm_size[sampling_freq_code];
  139.   atrack->samples_per_frame = 1536; // fixed amount from rfc draft
  140.   acmod = (code >> 13) & 0x7;
  141.   atrack->channels = mpeg3_ac3_acmodes[acmod];
  142.   skipbits = 3;
  143.   if ((acmod & 0x1) && (acmod != 1)) {
  144.     skipbits += 2;
  145.   }
  146.   if (acmod & 0x4) skipbits += 2;
  147.   if (acmod == 0x2) skipbits += 2;
  148.   mask = 1 << (15 - skipbits);
  149.   if ((code & mask) != 0) atrack->channels++;
  150.   return 0;
  151. }
  152. static int mpeg3_atrack_suck_frame_info (mpeg3_atrack_t *atrack)
  153. {
  154.   mpeg3_demuxer_t *demux;
  155.   demux = atrack->demuxer;
  156.   if (atrack->format == AUDIO_UNKNOWN) {
  157.     uint16_t code;
  158.     code = mpeg3demux_read_char(demux);
  159.     code <<= 8;
  160.     code |= mpeg3demux_read_char(demux);
  161.     if (code == MPEG3_AC3_START_CODE) {
  162.       atrack->format = AUDIO_AC3;
  163.     } else if ((code & 0xfff8) == 0xfff8) {
  164.       atrack->format = AUDIO_MPEG;
  165.     } else {
  166.       atrack->format = AUDIO_AAC;
  167.     }
  168.     code = mpeg3demux_read_prev_char(demux);
  169.     code = mpeg3demux_read_prev_char(demux);
  170.   }
  171.   
  172.   switch (atrack->format) {
  173.   case AUDIO_PCM:
  174.     atrack->sample_rate = 48000;
  175.     atrack->channels = 2;
  176.     atrack->framesize = 0x7db;
  177.     break;
  178.   case AUDIO_MPEG:
  179.     if (mpeg3_atrack_get_mp3_info(atrack) < 0) return -1;
  180.     break;
  181.   case AUDIO_AC3:
  182.     if (mpeg3_atrack_get_ac3_info(atrack) < 0) return -1;
  183.     break;
  184.   case AUDIO_AAC:
  185.     if (mpeg3_atrack_get_aac_info(atrack) < 0) return -1;
  186.     break;
  187.   }
  188.   mpeg3demux_seek_start(demux);
  189. }
  190. mpeg3_atrack_t* mpeg3_new_atrack(mpeg3_t *file, 
  191. int stream_id, 
  192. int format, 
  193. mpeg3_demuxer_t *demuxer,
  194. int number)
  195. {
  196. mpeg3_atrack_t *new_atrack;
  197. new_atrack = calloc(1, sizeof(mpeg3_atrack_t));
  198. new_atrack->file = file;
  199. new_atrack->channels = 0;
  200. new_atrack->sample_rate = 0;
  201. new_atrack->total_samples = 0;
  202. new_atrack->percentage_seek = -1;
  203. new_atrack->demuxer = mpeg3_new_demuxer(file, 1, 0, stream_id);
  204. if(new_atrack->demuxer) mpeg3demux_copy_titles(new_atrack->demuxer, demuxer);
  205. new_atrack->current_position = 0;
  206. new_atrack->format = format;
  207. if (mpeg3_atrack_suck_frame_info(new_atrack) < 0 ||
  208.     new_atrack->format == AUDIO_UNKNOWN) {
  209. /* Failed */
  210.   mpeg3_delete_atrack(file, new_atrack);
  211.   new_atrack = NULL;
  212. }
  213. //printf("mpeg3 demux length %gn", mpeg3demux_length(new_atrack->demuxer));
  214. // Copy pointers
  215. if(file->sample_offsets)
  216. {
  217. new_atrack->sample_offsets = file->sample_offsets[number];
  218. new_atrack->total_sample_offsets = file->total_sample_offsets[number];
  219. new_atrack->total_frames = new_atrack->total_sample_offsets / 
  220.   new_atrack->samples_per_frame;
  221. } else {
  222.   double time;
  223.   if (new_atrack->samples_per_frame != 0) {
  224.     time = mpeg3demux_length(new_atrack->demuxer);
  225.     time *= new_atrack->sample_rate;
  226.     time /= new_atrack->samples_per_frame;
  227.     new_atrack->total_frames = (uint32_t)time;
  228.     new_atrack->total_sample_offsets = new_atrack->total_frames * 
  229.       new_atrack->samples_per_frame;
  230.     //printf("total frames %dn", new_atrack->total_frames);
  231.   } else {
  232.     new_atrack->total_frames = 0;
  233.     new_atrack->total_sample_offsets = 0;
  234.   }
  235. //printf("total offsets %ldn", new_atrack->total_sample_offsets);
  236. return new_atrack;
  237. }
  238. int mpeg3_delete_atrack(mpeg3_t *file, mpeg3_atrack_t *atrack)
  239. {
  240. if(atrack->demuxer) mpeg3_delete_demuxer(atrack->demuxer);
  241. free(atrack);
  242. return 0;
  243. }
  244. static int mpeg3_atrack_check_length (unsigned char **output, 
  245.       uint32_t cmplen,
  246.       uint32_t *maxlen)
  247. {
  248.   if (cmplen > *maxlen) {
  249.     *output = (unsigned char *)realloc(*output, cmplen);
  250.     if (*output == NULL) return -1;
  251.     *maxlen = cmplen;
  252.   }
  253.   return 0;
  254. }
  255.    
  256. static int mpeg3_atrack_read_pcm_frame (mpeg3_atrack_t *atrack,
  257. unsigned char **output,
  258. uint32_t *len,
  259. uint32_t *maxlen)
  260. {
  261.   uint16_t code;
  262.   mpeg3_demuxer_t *demux;
  263.   uint32_t frame_sample;
  264.   int ret;
  265.   demux = atrack->demuxer;
  266.   code = mpeg3demux_read_char(demux);
  267.   do {
  268.     code <<= 8;
  269.     code |= mpeg3demux_read_char(demux);
  270.   } while (!mpeg3demux_eof(demux) && code != MPEG3_PCM_START_CODE);
  271.   if (mpeg3demux_eof(demux)) return -1;
  272.   frame_sample = (atrack->framesize - 3) / atrack->channels / 2;
  273.   *len = frame_sample * atrack->channels * (sizeof(uint16_t));
  274.   if (mpeg3_atrack_check_length(output, *len, maxlen) < 0) return -1;
  275.  
  276.   ret = mpeg3demux_read_data(demux, *output, *len);
  277.   if (ret != *len) return -1;
  278.   return 0;
  279. }
  280. static int mpeg3_atrack_read_mp3_frame (mpeg3_atrack_t *atrack,
  281. unsigned char **output,
  282. uint32_t *len,
  283. uint32_t *maxlen)
  284. {
  285.   uint8_t code[4];
  286.   mpeg3_demuxer_t *demux;
  287.   uint32_t frame_samples;
  288.   int ret;
  289.   MP4AV_Mp3Header temp;
  290.   int cnt = 1;
  291.   demux = atrack->demuxer;
  292.   code[1] = mpeg3demux_read_char(demux);
  293.   do {
  294.     code[0] = code[1];
  295.     code[1] = mpeg3demux_read_char(demux);
  296.     cnt++;
  297.   } while (!mpeg3demux_eof(demux) && 
  298.    (code[0] != 0xff || ((code[1] & 0xe0) != 0xe0)));
  299.   if (mpeg3demux_eof(demux)) return -1;
  300.   code[2] = mpeg3demux_read_char(demux);
  301.   code[3] = mpeg3demux_read_char(demux);
  302.   temp = MP4AV_Mp3HeaderFromBytes(code);
  303.   *len = MP4AV_Mp3GetFrameSize(temp);
  304.   //printf("header is %08x framesize %dn", temp, *len);
  305.   if (mpeg3_atrack_check_length(output, *len, maxlen) < 0) return -1;
  306.   memcpy(*output, code, 4);
  307.   ret = mpeg3demux_read_data(demux, *output + 4, *len - 4);
  308.   if (ret != *len - 4) return -1;
  309.   return 0;
  310. }
  311. static int mpeg3_atrack_read_aac_frame (mpeg3_atrack_t *atrack,
  312. unsigned char **output, 
  313. uint32_t *len, 
  314. uint32_t *maxlen)
  315. {
  316.   mpeg3_demuxer_t *demux;
  317.   uint16_t hdr_size, ix;
  318.   uint32_t bytes;
  319.   unsigned char hdr[16];
  320.   int ret;
  321.   demux = atrack->demuxer;
  322.   hdr[1] = mpeg3demux_read_char(demux);
  323.   do {
  324.     hdr[0] = hdr[1];
  325.     hdr[1] = mpeg3demux_read_char(demux);
  326.   } while (((hdr[0] != 0xff) || 
  327.    ((hdr[1] & 0xf0) != 0xf0)) && 
  328.    !mpeg3demux_eof(demux));
  329.   bytes = atrack->channels * sizeof(uint16_t) * atrack->samples_per_frame;
  330.   if (mpeg3demux_eof(demux)) return -1;
  331.   hdr_size = MP4AV_AdtsGetHeaderByteSize(hdr);
  332.   if (hdr_size > sizeof(hdr)) return -1;
  333.   for (ix = 2; ix < hdr_size; ix++) {
  334.     hdr[ix] = mpeg3demux_read_char(demux);
  335.   }
  336.   if (mpeg3demux_eof(demux)) return -1;
  337.   bytes = MP4AV_AdtsGetFrameSize(hdr);
  338.   *len = bytes;
  339.   if (mpeg3_atrack_check_length(output, *len, maxlen) < 0) return -1;
  340.   memcpy(*output, hdr, hdr_size);
  341.   ret = mpeg3demux_read_data(demux, *output + hdr_size, *len - hdr_size);
  342.   if (ret != *len - hdr_size) return -1;
  343.   return 0;
  344. }
  345. static int mpeg3_atrack_read_ac3_frame (mpeg3_atrack_t *atrack,
  346. unsigned char **output, 
  347. uint32_t *len, 
  348. uint32_t *maxlen)
  349. {
  350.   uint16_t code;
  351.   mpeg3_demuxer_t *demux;
  352.   int ret;
  353.   demux = atrack->demuxer;
  354.   code = mpeg3demux_read_char(demux);
  355.   do {
  356.     code &= 0xff;
  357.     code <<= 8;
  358.     code |= mpeg3demux_read_char(demux);
  359.   } while (!mpeg3demux_eof(demux) && code != MPEG3_AC3_START_CODE);
  360.   if (mpeg3demux_eof(demux)) return -1;
  361.   *len = atrack->framesize;
  362.   if (mpeg3_atrack_check_length(output, *len, maxlen) < 0) return -1;
  363.   *output[0] = code >> 8;
  364.   *output[1] = code & 0xff;
  365.   ret = mpeg3demux_read_data(demux, *output + 2, *len - 2);
  366.   if (ret != *len - 2) return -1;
  367.   return 0;
  368. }
  369. int mpeg3_atrack_read_frame (mpeg3_atrack_t *atrack, 
  370.      unsigned char **output,
  371.      uint32_t *len,
  372.      uint32_t *maxlen)
  373. {
  374.   if (atrack->percentage_seek >= 0) {
  375.     mpeg3demux_seek_percentage(atrack->demuxer, atrack->percentage_seek);
  376.     atrack->percentage_seek = -1;
  377.   }
  378.   switch (atrack->format) {
  379.   case AUDIO_PCM:
  380.     return (mpeg3_atrack_read_pcm_frame(atrack, output, len, maxlen));
  381.   case AUDIO_MPEG:
  382.     return (mpeg3_atrack_read_mp3_frame(atrack, output, len, maxlen));
  383.   case AUDIO_AC3:
  384.     return (mpeg3_atrack_read_ac3_frame(atrack, output, len, maxlen));
  385.   case AUDIO_AAC:
  386.     return (mpeg3_atrack_read_aac_frame(atrack, output, len, maxlen));
  387.   }
  388.   return -1;
  389. }
  390. int mpeg3atrack_seek_percentage(mpeg3_atrack_t *atrack, double percentage)
  391. {
  392.   atrack->percentage_seek = percentage;
  393.   return 0;
  394. }