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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "mpeg4ip.h"
  2. #include "mpeg2_transport.h"
  3. #include <assert.h>
  4. #include "mp4av.h"
  5. #include "mpeg2t_private.h"
  6. static uint32_t mpeg2t_find_mp3_frame_start (mpeg2t_es_t *es_pid, 
  7.      const uint8_t *esptr, 
  8.      uint32_t buflen)
  9. {
  10.   const uint8_t *fptr;
  11.   int found = 0;
  12.   int dropped = 0;
  13.   int offset, tocopy;
  14.   uint32_t framesize;
  15.   if (es_pid->left != 0) {
  16.     memcpy(es_pid->left_buff + es_pid->left,
  17.    esptr, 
  18.    3);
  19.     found = MP4AV_Mp3GetNextFrame(es_pid->left_buff, 4, &fptr, 
  20.   &framesize, FALSE, TRUE);
  21.     if (found) {
  22.       dropped = fptr - (const uint8_t *)&es_pid->left_buff[0];
  23. #if 0
  24.       mpeg2t_message("MP3 - Found in left - %d dropped %d", es_pid->left, dropped);
  25. #endif
  26.     } else {
  27.       es_pid->left = 0;
  28.     }
  29.   }
  30.   if (found == 0) {
  31.     found = MP4AV_Mp3GetNextFrame(esptr, buflen, &fptr, &framesize, 
  32.   FALSE, TRUE);
  33.     if (found == 0) {
  34.       memcpy(es_pid->left_buff,
  35.      esptr + buflen - 3, 
  36.      3);
  37.       es_pid->left = 3;
  38.       return buflen;
  39.     }
  40.     dropped = fptr - esptr;
  41.   }
  42.   if (found) {
  43.     mpeg2t_malloc_es_work(es_pid, framesize);
  44.     if (es_pid->work == NULL) return buflen;
  45.       
  46.     offset = 0;
  47.     if (es_pid->left) {
  48.       offset = es_pid->left - dropped;
  49.       memcpy(es_pid->work->frame, es_pid->left_buff + dropped, offset);
  50.       es_pid->work_loaded = offset;
  51.       es_pid->left = 0;
  52.       dropped = 0;
  53.     }
  54.     tocopy = MIN(buflen - dropped, framesize);
  55.     memcpy(es_pid->work->frame + offset, 
  56.    esptr + dropped,
  57.    tocopy);
  58.     es_pid->work_loaded += tocopy;
  59. #if 0
  60.     printf("start framesize %d copied %dn", es_pid->work->frame_len,
  61.    es_pid->work_loaded);
  62. #endif
  63.     return tocopy + dropped;
  64.   }
  65.   return buflen;
  66. }
  67. int process_mpeg2t_mpeg_audio (mpeg2t_es_t *es_pid, 
  68.        const uint8_t *esptr, 
  69.        uint32_t buflen)
  70. {
  71.   uint32_t used;
  72.   int ret;
  73.   uint32_t tocopy;
  74.   if ((es_pid->stream_id & 0xe0) != 0xc0) {
  75.     mpeg2t_message(LOG_ERR, 
  76.    "Illegal stream id %x in mpeg audio stream - PID %x",
  77.    es_pid->stream_id, es_pid->pid.pid);
  78.     return -1;
  79.   }
  80.   ret = 0;
  81.   while (buflen > 0) {
  82.     if (es_pid->work == NULL) {
  83.       if (buflen < 4) {
  84. memcpy(es_pid->left_buff, esptr, buflen);
  85. es_pid->left = buflen;
  86. return ret;
  87.       }
  88.       used = mpeg2t_find_mp3_frame_start(es_pid, esptr, buflen);
  89.       esptr += buflen;
  90.       buflen -= used;
  91.     } else {
  92.       tocopy = MIN(buflen, (es_pid->work->frame_len - es_pid->work_loaded));
  93.       memcpy(es_pid->work->frame + es_pid->work_loaded, esptr, tocopy);
  94.       buflen -= tocopy;
  95.       es_pid->work_loaded += tocopy;
  96.       esptr += tocopy;
  97. #if 0
  98.       printf("added %d bytes to %dn", tocopy, es_pid->work_loaded);
  99. #endif
  100.     }
  101.     if (es_pid->work != NULL &&
  102. es_pid->work_loaded == es_pid->work->frame_len) {
  103.       mpeg2t_finished_es_work(es_pid, es_pid->work_loaded);
  104.       ret = 1;
  105.     }
  106.   }
  107.   return ret;
  108. }