decoder.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:11k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.  * libmad - MPEG audio decoder library
  3.  */
  4. # ifdef HAVE_CONFIG_H
  5. #  include "config.h"
  6. # endif
  7. # include "global.h"
  8. # ifdef HAVE_SYS_TYPES_H
  9. #  include <sys/types.h>
  10. # endif
  11. # ifdef HAVE_SYS_WAIT_H
  12. #  include <sys/wait.h>
  13. # endif
  14. # ifdef HAVE_UNISTD_H
  15. #  include <unistd.h>
  16. # endif
  17. # ifdef HAVE_FCNTL_H
  18. #  include <fcntl.h>
  19. # endif
  20. # include <stdlib.h>
  21. # ifdef HAVE_ERRNO_H
  22. #  include <errno.h>
  23. # endif
  24. # include "stream.h"
  25. # include "frame.h"
  26. # include "synth.h"
  27. # include "decoder.h"
  28. void mad_decoder_init(struct mad_decoder *decoder, void *data,
  29.       enum mad_flow (*input_func)(void *,
  30.   struct mad_stream *),
  31.       enum mad_flow (*header_func)(void *,
  32.    struct mad_header const *),
  33.       enum mad_flow (*filter_func)(void *,
  34.    struct mad_stream const *,
  35.    struct mad_frame *),
  36.       enum mad_flow (*output_func)(void *,
  37.    struct mad_header const *,
  38.    struct mad_pcm *),
  39.       enum mad_flow (*error_func)(void *,
  40.   struct mad_stream *,
  41.   struct mad_frame *),
  42.       enum mad_flow (*message_func)(void *,
  43.     void *, unsigned int *))
  44. {
  45.   decoder->mode         = -1;
  46.   decoder->options      = 0;
  47.   decoder->async.pid    = 0;
  48.   decoder->async.in     = -1;
  49.   decoder->async.out    = -1;
  50.   decoder->sync         = 0;
  51.   decoder->cb_data      = data;
  52.   decoder->input_func   = input_func;
  53.   decoder->header_func  = header_func;
  54.   decoder->filter_func  = filter_func;
  55.   decoder->output_func  = output_func;
  56.   decoder->error_func   = error_func;
  57.   decoder->message_func = message_func;
  58. }
  59. int mad_decoder_finish(struct mad_decoder *decoder)
  60. {
  61. # if defined(USE_ASYNC)
  62.   if (decoder->mode == MAD_DECODER_MODE_ASYNC && decoder->async.pid) {
  63.     pid_t pid;
  64.     int status;
  65.     close(decoder->async.in);
  66.     do
  67.       pid = waitpid(decoder->async.pid, &status, 0);
  68.     while (pid == -1 && errno == EINTR);
  69.     decoder->mode = -1;
  70.     close(decoder->async.out);
  71.     decoder->async.pid = 0;
  72.     decoder->async.in  = -1;
  73.     decoder->async.out = -1;
  74.     if (pid == -1)
  75.       return -1;
  76.     return (!WIFEXITED(status) || WEXITSTATUS(status)) ? -1 : 0;
  77.   }
  78. # endif
  79.   return 0;
  80. }
  81. # if defined(USE_ASYNC)
  82. static
  83. enum mad_flow send_io(int fd, void const *data, size_t len)
  84. {
  85.   char const *ptr = data;
  86.   ssize_t count;
  87.   while (len) {
  88.     do
  89.       count = write(fd, ptr, len);
  90.     while (count == -1 && errno == EINTR);
  91.     if (count == -1)
  92.       return MAD_FLOW_BREAK;
  93.     len -= count;
  94.     ptr += count;
  95.   }
  96.   return MAD_FLOW_CONTINUE;
  97. }
  98. static
  99. enum mad_flow receive_io(int fd, void *buffer, size_t len)
  100. {
  101.   char *ptr = buffer;
  102.   ssize_t count;
  103.   while (len) {
  104.     do
  105.       count = read(fd, ptr, len);
  106.     while (count == -1 && errno == EINTR);
  107.     if (count == -1)
  108.       return (errno == EAGAIN) ? MAD_FLOW_IGNORE : MAD_FLOW_BREAK;
  109.     else if (count == 0)
  110.       return MAD_FLOW_STOP;
  111.     len -= count;
  112.     ptr += count;
  113.   }
  114.   return MAD_FLOW_CONTINUE;
  115. }
  116. static
  117. enum mad_flow receive_io_blocking(int fd, void *buffer, size_t len)
  118. {
  119.   int flags, blocking;
  120.   enum mad_flow result;
  121.   flags = fcntl(fd, F_GETFL);
  122.   if (flags == -1)
  123.     return MAD_FLOW_BREAK;
  124.   blocking = flags & ~O_NONBLOCK;
  125.   if (blocking != flags &&
  126.       fcntl(fd, F_SETFL, blocking) == -1)
  127.     return MAD_FLOW_BREAK;
  128.   result = receive_io(fd, buffer, len);
  129.   if (flags != blocking &&
  130.       fcntl(fd, F_SETFL, flags) == -1)
  131.     return MAD_FLOW_BREAK;
  132.   return result;
  133. }
  134. static
  135. enum mad_flow send(int fd, void const *message, unsigned int size)
  136. {
  137.   enum mad_flow result;
  138.   /* send size */
  139.   result = send_io(fd, &size, sizeof(size));
  140.   /* send message */
  141.   if (result == MAD_FLOW_CONTINUE)
  142.     result = send_io(fd, message, size);
  143.   return result;
  144. }
  145. static
  146. enum mad_flow receive(int fd, void **message, unsigned int *size)
  147. {
  148.   enum mad_flow result;
  149.   unsigned int actual;
  150.   if (*message == 0)
  151.     *size = 0;
  152.   /* receive size */
  153.   result = receive_io(fd, &actual, sizeof(actual));
  154.   /* receive message */
  155.   if (result == MAD_FLOW_CONTINUE) {
  156.     if (actual > *size)
  157.       actual -= *size;
  158.     else {
  159.       *size  = actual;
  160.       actual = 0;
  161.     }
  162.     if (*size > 0) {
  163.       if (*message == 0) {
  164. *message = malloc(*size);
  165. if (*message == 0)
  166.   return MAD_FLOW_BREAK;
  167.       }
  168.       result = receive_io_blocking(fd, *message, *size);
  169.     }
  170.     /* throw away remainder of message */
  171.     while (actual && result == MAD_FLOW_CONTINUE) {
  172.       char sink[256];
  173.       unsigned int len;
  174.       len = actual > sizeof(sink) ? sizeof(sink) : actual;
  175.       result = receive_io_blocking(fd, sink, len);
  176.       actual -= len;
  177.     }
  178.   }
  179.   return result;
  180. }
  181. static
  182. enum mad_flow check_message(struct mad_decoder *decoder)
  183. {
  184.   enum mad_flow result;
  185.   void *message = 0;
  186.   unsigned int size;
  187.   result = receive(decoder->async.in, &message, &size);
  188.   if (result == MAD_FLOW_CONTINUE) {
  189.     if (decoder->message_func == 0)
  190.       size = 0;
  191.     else {
  192.       result = decoder->message_func(decoder->cb_data, message, &size);
  193.       if (result == MAD_FLOW_IGNORE ||
  194.   result == MAD_FLOW_BREAK)
  195. size = 0;
  196.     }
  197.     if (send(decoder->async.out, message, size) != MAD_FLOW_CONTINUE)
  198.       result = MAD_FLOW_BREAK;
  199.   }
  200.   if (message)
  201.     free(message);
  202.   return result;
  203. }
  204. # endif
  205. static
  206. enum mad_flow error_default(void *data, struct mad_stream *stream,
  207.     struct mad_frame *frame)
  208. {
  209.   int *bad_last_frame = data;
  210.   switch (stream->error) {
  211.   case MAD_ERROR_BADCRC:
  212.     if (*bad_last_frame)
  213.       mad_frame_mute(frame);
  214.     else
  215.       *bad_last_frame = 1;
  216.     return MAD_FLOW_IGNORE;
  217.   default:
  218.     return MAD_FLOW_CONTINUE;
  219.   }
  220. }
  221. static
  222. int run_sync(struct mad_decoder *decoder)
  223. {
  224.   enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);
  225.   void *error_data;
  226.   int bad_last_frame = 0;
  227.   struct mad_stream *stream;
  228.   struct mad_frame *frame;
  229.   struct mad_synth *synth;
  230.   int result = 0;
  231.   if (decoder->input_func == 0)
  232.     return 0;
  233.   if (decoder->error_func) {
  234.     error_func = decoder->error_func;
  235.     error_data = decoder->cb_data;
  236.   }
  237.   else {
  238.     error_func = error_default;
  239.     error_data = &bad_last_frame;
  240.   }
  241.   stream = &decoder->sync->stream;
  242.   frame  = &decoder->sync->frame;
  243.   synth  = &decoder->sync->synth;
  244.   mad_stream_init(stream);
  245.   mad_frame_init(frame);
  246.   mad_synth_init(synth);
  247.   mad_stream_options(stream, decoder->options);
  248.   do {
  249.     switch (decoder->input_func(decoder->cb_data, stream)) {
  250.     case MAD_FLOW_STOP:
  251.       goto done;
  252.     case MAD_FLOW_BREAK:
  253.       goto fail;
  254.     case MAD_FLOW_IGNORE:
  255.       continue;
  256.     case MAD_FLOW_CONTINUE:
  257.       break;
  258.     }
  259.     while (1) {
  260. # if defined(USE_ASYNC)
  261.       if (decoder->mode == MAD_DECODER_MODE_ASYNC) {
  262. switch (check_message(decoder)) {
  263. case MAD_FLOW_IGNORE:
  264. case MAD_FLOW_CONTINUE:
  265.   break;
  266. case MAD_FLOW_BREAK:
  267.   goto fail;
  268. case MAD_FLOW_STOP:
  269.   goto done;
  270. }
  271.       }
  272. # endif
  273.       if (decoder->header_func) {
  274. if (mad_header_decode(&frame->header, stream) == -1) {
  275.   if (!MAD_RECOVERABLE(stream->error))
  276.     break;
  277.   switch (error_func(error_data, stream, frame)) {
  278.   case MAD_FLOW_STOP:
  279.     goto done;
  280.   case MAD_FLOW_BREAK:
  281.     goto fail;
  282.   case MAD_FLOW_IGNORE:
  283.   case MAD_FLOW_CONTINUE:
  284.   default:
  285.     continue;
  286.   }
  287. }
  288. switch (decoder->header_func(decoder->cb_data, &frame->header)) {
  289. case MAD_FLOW_STOP:
  290.   goto done;
  291. case MAD_FLOW_BREAK:
  292.   goto fail;
  293. case MAD_FLOW_IGNORE:
  294.   continue;
  295. case MAD_FLOW_CONTINUE:
  296.   break;
  297. }
  298.       }
  299.       if (mad_frame_decode(frame, stream) == -1) {
  300. if (!MAD_RECOVERABLE(stream->error))
  301.   break;
  302. switch (error_func(error_data, stream, frame)) {
  303. case MAD_FLOW_STOP:
  304.   goto done;
  305. case MAD_FLOW_BREAK:
  306.   goto fail;
  307. case MAD_FLOW_IGNORE:
  308.   break;
  309. case MAD_FLOW_CONTINUE:
  310. default:
  311.   continue;
  312. }
  313.       }
  314.       else
  315. bad_last_frame = 0;
  316.       if (decoder->filter_func) {
  317. switch (decoder->filter_func(decoder->cb_data, stream, frame)) {
  318. case MAD_FLOW_STOP:
  319.   goto done;
  320. case MAD_FLOW_BREAK:
  321.   goto fail;
  322. case MAD_FLOW_IGNORE:
  323.   continue;
  324. case MAD_FLOW_CONTINUE:
  325.   break;
  326. }
  327.       }
  328.       mad_synth_frame(synth, frame);
  329.       if (decoder->output_func) {
  330. switch (decoder->output_func(decoder->cb_data,
  331.      &frame->header, &synth->pcm)) {
  332. case MAD_FLOW_STOP:
  333.   goto done;
  334. case MAD_FLOW_BREAK:
  335.   goto fail;
  336. case MAD_FLOW_IGNORE:
  337. case MAD_FLOW_CONTINUE:
  338.   break;
  339. }
  340.       }
  341.     }
  342.   }
  343.   while (stream->error == MAD_ERROR_BUFLEN);
  344.  fail:
  345.   result = -1;
  346.  done:
  347.   mad_synth_finish(synth);
  348.   mad_frame_finish(frame);
  349.   mad_stream_finish(stream);
  350.   return result;
  351. }
  352. # if defined(USE_ASYNC)
  353. static
  354. int run_async(struct mad_decoder *decoder)
  355. {
  356.   pid_t pid;
  357.   int ptoc[2], ctop[2], flags;
  358.   if (pipe(ptoc) == -1)
  359.     return -1;
  360.   if (pipe(ctop) == -1) {
  361.     close(ptoc[0]);
  362.     close(ptoc[1]);
  363.     return -1;
  364.   }
  365.   flags = fcntl(ptoc[0], F_GETFL);
  366.   if (flags == -1 ||
  367.       fcntl(ptoc[0], F_SETFL, flags | O_NONBLOCK) == -1) {
  368.     close(ctop[0]);
  369.     close(ctop[1]);
  370.     close(ptoc[0]);
  371.     close(ptoc[1]);
  372.     return -1;
  373.   }
  374.   pid = fork();
  375.   if (pid == -1) {
  376.     close(ctop[0]);
  377.     close(ctop[1]);
  378.     close(ptoc[0]);
  379.     close(ptoc[1]);
  380.     return -1;
  381.   }
  382.   decoder->async.pid = pid;
  383.   if (pid) {
  384.     /* parent */
  385.     close(ptoc[0]);
  386.     close(ctop[1]);
  387.     decoder->async.in  = ctop[0];
  388.     decoder->async.out = ptoc[1];
  389.     return 0;
  390.   }
  391.   /* child */
  392.   close(ptoc[1]);
  393.   close(ctop[0]);
  394.   decoder->async.in  = ptoc[0];
  395.   decoder->async.out = ctop[1];
  396.   _exit(run_sync(decoder));
  397.   /* not reached */
  398.   return -1;
  399. }
  400. # endif
  401. int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode)
  402. {
  403.   int result;
  404.   int (*run)(struct mad_decoder *) = 0;
  405.   switch (decoder->mode = mode) {
  406.   case MAD_DECODER_MODE_SYNC:
  407.     run = run_sync;
  408.     break;
  409.   case MAD_DECODER_MODE_ASYNC:
  410. # if defined(USE_ASYNC)
  411.     run = run_async;
  412. # endif
  413.     break;
  414.   }
  415.   if (run == 0)
  416.     return -1;
  417.   decoder->sync = malloc(sizeof(*decoder->sync));
  418.   if (decoder->sync == 0)
  419.     return -1;
  420.   result = run(decoder);
  421.   free(decoder->sync);
  422.   decoder->sync = 0;
  423.   return result;
  424. }
  425. int mad_decoder_message(struct mad_decoder *decoder,
  426. void *message, unsigned int *len)
  427. {
  428. # if defined(USE_ASYNC)
  429.   if (decoder->mode != MAD_DECODER_MODE_ASYNC ||
  430.       send(decoder->async.out, message, *len) != MAD_FLOW_CONTINUE ||
  431.       receive(decoder->async.in, &message, len) != MAD_FLOW_CONTINUE)
  432.     return -1;
  433.   return 0;
  434. # else
  435.   return -1;
  436. # endif
  437. }