亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? decoder.c

?? c++系統(tǒng)開發(fā)實(shí)例精粹內(nèi)附的80例源代碼 環(huán)境:windows2000,c++6.0
?? C
字號(hào):
/*
 * libmad - MPEG audio decoder library
 */

# ifdef HAVE_CONFIG_H
#  include "config.h"
# endif

# include "global.h"

# ifdef HAVE_SYS_TYPES_H
#  include <sys/types.h>
# endif

# ifdef HAVE_SYS_WAIT_H
#  include <sys/wait.h>
# endif

# ifdef HAVE_UNISTD_H
#  include <unistd.h>
# endif

# ifdef HAVE_FCNTL_H
#  include <fcntl.h>
# endif

# include <stdlib.h>

# ifdef HAVE_ERRNO_H
#  include <errno.h>
# endif

# include "stream.h"
# include "frame.h"
# include "synth.h"
# include "decoder.h"

void mad_decoder_init(struct mad_decoder *decoder, void *data,
		      enum mad_flow (*input_func)(void *,
						  struct mad_stream *),
		      enum mad_flow (*header_func)(void *,
						   struct mad_header const *),
		      enum mad_flow (*filter_func)(void *,
						   struct mad_stream const *,
						   struct mad_frame *),
		      enum mad_flow (*output_func)(void *,
						   struct mad_header const *,
						   struct mad_pcm *),
		      enum mad_flow (*error_func)(void *,
						  struct mad_stream *,
						  struct mad_frame *),
		      enum mad_flow (*message_func)(void *,
						    void *, unsigned int *))
{
  decoder->mode         = -1;

  decoder->options      = 0;

  decoder->async.pid    = 0;
  decoder->async.in     = -1;
  decoder->async.out    = -1;

  decoder->sync         = 0;

  decoder->cb_data      = data;

  decoder->input_func   = input_func;
  decoder->header_func  = header_func;
  decoder->filter_func  = filter_func;
  decoder->output_func  = output_func;
  decoder->error_func   = error_func;
  decoder->message_func = message_func;
}

int mad_decoder_finish(struct mad_decoder *decoder)
{
# if defined(USE_ASYNC)
  if (decoder->mode == MAD_DECODER_MODE_ASYNC && decoder->async.pid) {
    pid_t pid;
    int status;

    close(decoder->async.in);

    do
      pid = waitpid(decoder->async.pid, &status, 0);
    while (pid == -1 && errno == EINTR);

    decoder->mode = -1;

    close(decoder->async.out);

    decoder->async.pid = 0;
    decoder->async.in  = -1;
    decoder->async.out = -1;

    if (pid == -1)
      return -1;

    return (!WIFEXITED(status) || WEXITSTATUS(status)) ? -1 : 0;
  }
# endif

  return 0;
}

# if defined(USE_ASYNC)
static
enum mad_flow send_io(int fd, void const *data, size_t len)
{
  char const *ptr = data;
  ssize_t count;

  while (len) {
    do
      count = write(fd, ptr, len);
    while (count == -1 && errno == EINTR);

    if (count == -1)
      return MAD_FLOW_BREAK;

    len -= count;
    ptr += count;
  }

  return MAD_FLOW_CONTINUE;
}

static
enum mad_flow receive_io(int fd, void *buffer, size_t len)
{
  char *ptr = buffer;
  ssize_t count;

  while (len) {
    do
      count = read(fd, ptr, len);
    while (count == -1 && errno == EINTR);

    if (count == -1)
      return (errno == EAGAIN) ? MAD_FLOW_IGNORE : MAD_FLOW_BREAK;
    else if (count == 0)
      return MAD_FLOW_STOP;

    len -= count;
    ptr += count;
  }

  return MAD_FLOW_CONTINUE;
}

static
enum mad_flow receive_io_blocking(int fd, void *buffer, size_t len)
{
  int flags, blocking;
  enum mad_flow result;

  flags = fcntl(fd, F_GETFL);
  if (flags == -1)
    return MAD_FLOW_BREAK;

  blocking = flags & ~O_NONBLOCK;

  if (blocking != flags &&
      fcntl(fd, F_SETFL, blocking) == -1)
    return MAD_FLOW_BREAK;

  result = receive_io(fd, buffer, len);

  if (flags != blocking &&
      fcntl(fd, F_SETFL, flags) == -1)
    return MAD_FLOW_BREAK;

  return result;
}

static
enum mad_flow send(int fd, void const *message, unsigned int size)
{
  enum mad_flow result;

  /* send size */

  result = send_io(fd, &size, sizeof(size));

  /* send message */

  if (result == MAD_FLOW_CONTINUE)
    result = send_io(fd, message, size);

  return result;
}

static
enum mad_flow receive(int fd, void **message, unsigned int *size)
{
  enum mad_flow result;
  unsigned int actual;

  if (*message == 0)
    *size = 0;

  /* receive size */

  result = receive_io(fd, &actual, sizeof(actual));

  /* receive message */

  if (result == MAD_FLOW_CONTINUE) {
    if (actual > *size)
      actual -= *size;
    else {
      *size  = actual;
      actual = 0;
    }

    if (*size > 0) {
      if (*message == 0) {
	*message = malloc(*size);
	if (*message == 0)
	  return MAD_FLOW_BREAK;
      }

      result = receive_io_blocking(fd, *message, *size);
    }

    /* throw away remainder of message */

    while (actual && result == MAD_FLOW_CONTINUE) {
      char sink[256];
      unsigned int len;

      len = actual > sizeof(sink) ? sizeof(sink) : actual;

      result = receive_io_blocking(fd, sink, len);

      actual -= len;
    }
  }

  return result;
}

static
enum mad_flow check_message(struct mad_decoder *decoder)
{
  enum mad_flow result;
  void *message = 0;
  unsigned int size;

  result = receive(decoder->async.in, &message, &size);

  if (result == MAD_FLOW_CONTINUE) {
    if (decoder->message_func == 0)
      size = 0;
    else {
      result = decoder->message_func(decoder->cb_data, message, &size);

      if (result == MAD_FLOW_IGNORE ||
	  result == MAD_FLOW_BREAK)
	size = 0;
    }

    if (send(decoder->async.out, message, size) != MAD_FLOW_CONTINUE)
      result = MAD_FLOW_BREAK;
  }

  if (message)
    free(message);

  return result;
}
# endif

static
enum mad_flow error_default(void *data, struct mad_stream *stream,
			    struct mad_frame *frame)
{
  int *bad_last_frame = data;

  switch (stream->error) {
  case MAD_ERROR_BADCRC:
    if (*bad_last_frame)
      mad_frame_mute(frame);
    else
      *bad_last_frame = 1;

    return MAD_FLOW_IGNORE;

  default:
    return MAD_FLOW_CONTINUE;
  }
}

static
int run_sync(struct mad_decoder *decoder)
{
  enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);
  void *error_data;
  int bad_last_frame = 0;
  struct mad_stream *stream;
  struct mad_frame *frame;
  struct mad_synth *synth;
  int result = 0;

  if (decoder->input_func == 0)
    return 0;

  if (decoder->error_func) {
    error_func = decoder->error_func;
    error_data = decoder->cb_data;
  }
  else {
    error_func = error_default;
    error_data = &bad_last_frame;
  }

  stream = &decoder->sync->stream;
  frame  = &decoder->sync->frame;
  synth  = &decoder->sync->synth;

  mad_stream_init(stream);
  mad_frame_init(frame);
  mad_synth_init(synth);

  mad_stream_options(stream, decoder->options);

  do {
    switch (decoder->input_func(decoder->cb_data, stream)) {
    case MAD_FLOW_STOP:
      goto done;
    case MAD_FLOW_BREAK:
      goto fail;
    case MAD_FLOW_IGNORE:
      continue;
    case MAD_FLOW_CONTINUE:
      break;
    }

    while (1) {
# if defined(USE_ASYNC)
      if (decoder->mode == MAD_DECODER_MODE_ASYNC) {
	switch (check_message(decoder)) {
	case MAD_FLOW_IGNORE:
	case MAD_FLOW_CONTINUE:
	  break;
	case MAD_FLOW_BREAK:
	  goto fail;
	case MAD_FLOW_STOP:
	  goto done;
	}
      }
# endif

      if (decoder->header_func) {
	if (mad_header_decode(&frame->header, stream) == -1) {
	  if (!MAD_RECOVERABLE(stream->error))
	    break;

	  switch (error_func(error_data, stream, frame)) {
	  case MAD_FLOW_STOP:
	    goto done;
	  case MAD_FLOW_BREAK:
	    goto fail;
	  case MAD_FLOW_IGNORE:
	  case MAD_FLOW_CONTINUE:
	  default:
	    continue;
	  }
	}

	switch (decoder->header_func(decoder->cb_data, &frame->header)) {
	case MAD_FLOW_STOP:
	  goto done;
	case MAD_FLOW_BREAK:
	  goto fail;
	case MAD_FLOW_IGNORE:
	  continue;
	case MAD_FLOW_CONTINUE:
	  break;
	}
      }

      if (mad_frame_decode(frame, stream) == -1) {
	if (!MAD_RECOVERABLE(stream->error))
	  break;

	switch (error_func(error_data, stream, frame)) {
	case MAD_FLOW_STOP:
	  goto done;
	case MAD_FLOW_BREAK:
	  goto fail;
	case MAD_FLOW_IGNORE:
	  break;
	case MAD_FLOW_CONTINUE:
	default:
	  continue;
	}
      }
      else
	bad_last_frame = 0;

      if (decoder->filter_func) {
	switch (decoder->filter_func(decoder->cb_data, stream, frame)) {
	case MAD_FLOW_STOP:
	  goto done;
	case MAD_FLOW_BREAK:
	  goto fail;
	case MAD_FLOW_IGNORE:
	  continue;
	case MAD_FLOW_CONTINUE:
	  break;
	}
      }

      mad_synth_frame(synth, frame);

      if (decoder->output_func) {
	switch (decoder->output_func(decoder->cb_data,
				     &frame->header, &synth->pcm)) {
	case MAD_FLOW_STOP:
	  goto done;
	case MAD_FLOW_BREAK:
	  goto fail;
	case MAD_FLOW_IGNORE:
	case MAD_FLOW_CONTINUE:
	  break;
	}
      }
    }
  }
  while (stream->error == MAD_ERROR_BUFLEN);

 fail:
  result = -1;

 done:
  mad_synth_finish(synth);
  mad_frame_finish(frame);
  mad_stream_finish(stream);

  return result;
}

# if defined(USE_ASYNC)
static
int run_async(struct mad_decoder *decoder)
{
  pid_t pid;
  int ptoc[2], ctop[2], flags;

  if (pipe(ptoc) == -1)
    return -1;

  if (pipe(ctop) == -1) {
    close(ptoc[0]);
    close(ptoc[1]);
    return -1;
  }

  flags = fcntl(ptoc[0], F_GETFL);
  if (flags == -1 ||
      fcntl(ptoc[0], F_SETFL, flags | O_NONBLOCK) == -1) {
    close(ctop[0]);
    close(ctop[1]);
    close(ptoc[0]);
    close(ptoc[1]);
    return -1;
  }

  pid = fork();
  if (pid == -1) {
    close(ctop[0]);
    close(ctop[1]);
    close(ptoc[0]);
    close(ptoc[1]);
    return -1;
  }

  decoder->async.pid = pid;

  if (pid) {
    /* parent */

    close(ptoc[0]);
    close(ctop[1]);

    decoder->async.in  = ctop[0];
    decoder->async.out = ptoc[1];

    return 0;
  }

  /* child */

  close(ptoc[1]);
  close(ctop[0]);

  decoder->async.in  = ptoc[0];
  decoder->async.out = ctop[1];

  _exit(run_sync(decoder));

  /* not reached */
  return -1;
}
# endif

int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode)
{
  int result;
  int (*run)(struct mad_decoder *) = 0;

  switch (decoder->mode = mode) {
  case MAD_DECODER_MODE_SYNC:
    run = run_sync;
    break;

  case MAD_DECODER_MODE_ASYNC:
# if defined(USE_ASYNC)
    run = run_async;
# endif
    break;
  }

  if (run == 0)
    return -1;

  decoder->sync = malloc(sizeof(*decoder->sync));
  if (decoder->sync == 0)
    return -1;

  result = run(decoder);

  free(decoder->sync);
  decoder->sync = 0;

  return result;
}

int mad_decoder_message(struct mad_decoder *decoder,
			void *message, unsigned int *len)
{
# if defined(USE_ASYNC)
  if (decoder->mode != MAD_DECODER_MODE_ASYNC ||
      send(decoder->async.out, message, *len) != MAD_FLOW_CONTINUE ||
      receive(decoder->async.in, &message, len) != MAD_FLOW_CONTINUE)
    return -1;

  return 0;
# else
  return -1;
# endif
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人久久视频在线观看| 国产免费观看久久| 欧美精品乱码久久久久久按摩| www.欧美精品一二区| 不卡一区二区三区四区| 成人黄色片在线观看| 成人性生交大片免费看中文 | 日韩电影免费一区| 亚洲一区二区高清| 丝袜脚交一区二区| 蜜桃av噜噜一区二区三区小说| 午夜精品久久久久| 日本成人在线网站| 狠狠色丁香九九婷婷综合五月| 精品一区二区三区蜜桃| 国产精品一区二区视频| 福利一区二区在线| 色综合天天综合网天天看片| 91成人国产精品| 欧美日韩国产一级二级| 欧美一级理论性理论a| 精品国产乱子伦一区| 国产色婷婷亚洲99精品小说| 国产精品污www在线观看| 亚洲欧美日韩人成在线播放| 亚洲国产精品久久不卡毛片 | 国产精品伊人色| 成人爱爱电影网址| 欧美日韩在线播放三区四区| 91精品一区二区三区在线观看| 欧美岛国在线观看| 国产精品另类一区| 亚洲成av人片在线观看无码| 久久精品国产亚洲5555| 国产成人aaa| 在线观看日韩毛片| 欧美成人欧美edvon| 成人免费在线观看入口| 亚洲丶国产丶欧美一区二区三区| 久久99在线观看| 91麻豆国产福利在线观看| 91精品国产乱| 欧美激情综合在线| 日韩黄色小视频| 成人免费毛片aaaaa**| 欧美日韩视频在线观看一区二区三区 | 色婷婷亚洲综合| 欧美一区二区三区四区视频| 国产亚洲成年网址在线观看| 夜夜揉揉日日人人青青一国产精品| 免费xxxx性欧美18vr| 成人蜜臀av电影| 91精品中文字幕一区二区三区| 国产午夜一区二区三区| 亚洲成人激情社区| 成人激情黄色小说| 日韩精品一区二区三区在线 | 国产精品初高中害羞小美女文| 亚洲成人av中文| 成人动漫在线一区| 日韩欧美高清在线| 亚洲综合色成人| 国产成人精品综合在线观看| 91精品国产91久久久久久一区二区| 国产精品午夜电影| 寂寞少妇一区二区三区| 欧美婷婷六月丁香综合色| 国产精品免费久久| 九一九一国产精品| 色天使久久综合网天天| 中文字幕不卡在线观看| 麻豆精品一区二区综合av| 欧美天天综合网| 亚洲欧洲一区二区在线播放| 国内精品写真在线观看| 7777精品伊人久久久大香线蕉的 | 久久精品国产精品青草| 在线观看国产日韩| 国产精品白丝在线| 激情图片小说一区| 欧美一级片在线观看| 亚洲综合色在线| 91麻豆国产自产在线观看| 国产精品美女久久久久av爽李琼| 精品一区免费av| 日韩一区二区三区视频| 丝袜美腿亚洲综合| 欧美日本视频在线| 亚洲一卡二卡三卡四卡五卡| 91天堂素人约啪| 国产精品国产三级国产aⅴ原创| 国产福利不卡视频| 国产日韩精品一区二区浪潮av| 看片的网站亚洲| 欧美电影影音先锋| 视频精品一区二区| 制服丝袜日韩国产| 天天av天天翘天天综合网| 欧美日本视频在线| 调教+趴+乳夹+国产+精品| 欧美日韩日日骚| 日韩**一区毛片| 日韩一级片网站| 久久国产福利国产秒拍| 日韩美女一区二区三区| 另类小说图片综合网| 精品精品欲导航| 国产一区二区三区四| 欧美国产一区视频在线观看| 成人一道本在线| 国产精品毛片大码女人| 91亚洲国产成人精品一区二三 | 精品一区二区三区久久久| 26uuu另类欧美| 国产成人三级在线观看| 中文字幕在线免费不卡| 91国内精品野花午夜精品| 亚洲在线免费播放| 制服.丝袜.亚洲.中文.综合| 蜜乳av一区二区| 久久久久99精品一区| 99久久99久久久精品齐齐| 亚洲自拍偷拍网站| 日韩一卡二卡三卡| 国产一区二区调教| 亚洲人吸女人奶水| 欧美老年两性高潮| 精品综合免费视频观看| 中文字幕高清一区| 在线这里只有精品| 琪琪久久久久日韩精品| 国产性做久久久久久| 色综合天天综合狠狠| 五月激情综合婷婷| 久久久精品免费网站| 91蜜桃婷婷狠狠久久综合9色| 亚洲高清在线视频| 久久综合九色综合97婷婷| 99re免费视频精品全部| 亚洲777理论| 国产日韩精品一区| 欧美色图在线观看| 国产一区在线视频| 亚洲制服欧美中文字幕中文字幕| 91精品国产麻豆国产自产在线| 国产伦精一区二区三区| 亚洲一区影音先锋| 2020国产精品自拍| 欧美性极品少妇| 国产成人精品免费在线| 亚洲午夜精品一区二区三区他趣| 精品国产乱码久久久久久闺蜜| 成人18精品视频| 美女网站在线免费欧美精品| 亚洲天堂福利av| 欧美变态tickle挠乳网站| 91香蕉国产在线观看软件| 久久精品二区亚洲w码| 亚洲品质自拍视频| 日韩一区二区三区精品视频 | 亚洲天堂久久久久久久| 日韩欧美激情四射| 欧美专区日韩专区| 成人一道本在线| 久久成人羞羞网站| 亚洲午夜在线视频| 中文字幕亚洲精品在线观看| 在线成人午夜影院| 91伊人久久大香线蕉| 国产乱码精品一区二区三区忘忧草 | 色婷婷久久久亚洲一区二区三区| 九九九精品视频| 视频一区二区三区入口| 18欧美乱大交hd1984| www激情久久| 欧美一区二区三区四区久久| 91久久国产综合久久| 国产91精品精华液一区二区三区 | 欧美一区二区观看视频| 色94色欧美sute亚洲线路一久| 福利一区二区在线观看| 极品少妇xxxx精品少妇| 日产精品久久久久久久性色| 亚洲一区二区在线视频| 亚洲人精品午夜| 国产精品久久久久久福利一牛影视| 欧美大胆人体bbbb| 91精品国产福利在线观看| 在线观看一区不卡| 91影院在线免费观看| 成人av高清在线| 国产成人欧美日韩在线电影| 寂寞少妇一区二区三区| 老司机精品视频在线| 美国毛片一区二区三区| 热久久一区二区| 日韩一区精品视频| 五月天国产精品| 日韩福利视频网| 日本不卡在线视频|