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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? decoder.c

?? libman mp3解碼庫
?? C
字號:
/* * libmad - MPEG audio decoder library * Copyright (C) 2000-2004 Underbit Technologies, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * $Id: decoder.c,v 1.22 2004/01/23 09:41:32 rob Exp $ */# 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"// Decalre a sync structure because no malloc and free are not implemented herestruct sync_t Sync;/* * NAME:	decoder->init() * DESCRIPTION:	initialize a decoder object with callback routines */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)staticenum 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;}staticenum 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;}staticenum 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;}staticenum 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;}staticenum 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;}staticenum 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;}# endifstaticenum 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;  }}staticint 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)staticint 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/* * NAME:	decoder->run() * DESCRIPTION:	run the decoder thread either synchronously or asynchronously */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));  decoder->sync = &Sync;  if (decoder->sync == 0)    return -1;  result = run(decoder);//  free(decoder->sync);  decoder->sync = 0;  return result;}/* * NAME:	decoder->message() * DESCRIPTION:	send a message to and receive a reply from the decoder process */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}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产综合视频在线观看 | 日韩高清在线不卡| 亚洲精品日韩一| 午夜精品久久久久| 极品少妇一区二区三区精品视频| 九色综合国产一区二区三区| 成人精品一区二区三区四区| 成人高清免费观看| 欧美日韩一区三区四区| 久久嫩草精品久久久精品一| 亚洲欧美经典视频| 九九国产精品视频| 色婷婷av一区二区三区大白胸| 欧美一级搡bbbb搡bbbb| 日韩美女视频一区| 精品一区二区在线视频| 91久久奴性调教| 亚洲国产精品激情在线观看| 天天色综合天天| 91免费看视频| 国产日韩精品视频一区| 亚洲国产成人av| 99久久精品国产一区| 国产亚洲精品精华液| 免费观看在线色综合| 亚洲综合视频网| 亚洲黄色免费电影| 久久99热99| 91精品在线观看入口| 99re成人精品视频| 欧美不卡在线视频| 美女视频免费一区| 欧美日韩国产天堂| 亚洲色大成网站www久久九九| 国产真实精品久久二三区| 日韩欧美久久一区| 美国欧美日韩国产在线播放| 67194成人在线观看| 日韩av高清在线观看| 欧美一区二区日韩| 日韩av中文字幕一区二区三区| 色综合天天视频在线观看| 国产精品欧美经典| 成人免费视频网站在线观看| 国产日韩欧美精品在线| www..com久久爱| 亚洲精品日韩一| 色国产综合视频| 亚洲成av人片观看| 欧美一区二区三区在线观看| 久久精品国产一区二区三区免费看 | 久久久国产一区二区三区四区小说 | 国产成人自拍网| 久久久影视传媒| www.欧美日韩| 亚洲综合成人在线| 日韩欧美一卡二卡| 国产精品乡下勾搭老头1| 国产精品传媒入口麻豆| 日本福利一区二区| 蜜臀av一区二区在线观看| 久久久精品人体av艺术| 欧美一区二区三区公司| 成人三级伦理片| 日韩成人一级片| 国产精品初高中害羞小美女文| 欧美色综合网站| 国产盗摄一区二区| 亚洲电影在线免费观看| 国产无一区二区| 欧美丰满嫩嫩电影| aaa欧美大片| 久久不见久久见中文字幕免费| 亚洲欧美激情在线| 欧美精品一区二区三区蜜臀| 在线亚洲人成电影网站色www| 久久99精品一区二区三区| 亚洲综合成人网| 中文字幕一区免费在线观看 | 色94色欧美sute亚洲线路一久| 久久国产精品99精品国产| 一区二区三区视频在线看| 欧美国产丝袜视频| 欧美精品一区二区三区在线播放| 欧美视频一区二区三区四区| 色婷婷av一区二区三区gif | 精品久久久久久久人人人人传媒| 欧美天堂亚洲电影院在线播放| 91视频在线观看| av电影一区二区| 成人黄色大片在线观看| 国产成a人无v码亚洲福利| 麻豆一区二区三| 人人精品人人爱| 蜜臀精品一区二区三区在线观看| 丝袜诱惑亚洲看片| 视频一区二区三区中文字幕| 懂色av一区二区三区蜜臀| 成人av在线资源网| 99精品国产91久久久久久| 北条麻妃国产九九精品视频| av欧美精品.com| 在线日韩国产精品| 制服丝袜av成人在线看| 日韩一级片在线观看| 日韩精品资源二区在线| 亚洲国产高清在线| 亚洲欧美经典视频| 秋霞成人午夜伦在线观看| 国内精品写真在线观看| 国产成人免费视频网站高清观看视频 | 欧美精品一区二区三区很污很色的 | 亚洲成a人在线观看| 久久精品国产秦先生| 亚洲美女电影在线| 亚洲国产一区视频| 国产精品中文字幕欧美| 91香蕉视频污| 91精品国产综合久久国产大片 | 中文字幕日韩av资源站| 亚洲丰满少妇videoshd| 日本成人在线不卡视频| 国产福利一区二区三区在线视频| 成人av资源下载| 精品国产不卡一区二区三区| 亚洲精品v日韩精品| 国产亲近乱来精品视频| 性久久久久久久久| 99精品在线免费| 精品成人一区二区三区| 亚洲动漫第一页| 99久久精品免费精品国产| 久久久久久久综合| 久久精品国产**网站演员| 在线观看亚洲成人| 国产精品久久久久一区| 蜜臀国产一区二区三区在线播放| 91黄色免费看| 中文av一区二区| 成人免费高清视频在线观看| 久久午夜色播影院免费高清| 五月激情综合网| 欧美日韩国产精品自在自线| 一区二区三区精密机械公司| av一本久道久久综合久久鬼色| 精品国产伦理网| 国产精品1024| 国产欧美日韩在线| 国产大陆a不卡| 国产丝袜美腿一区二区三区| 国产一区二区剧情av在线| 久久久久久久久久久久久女国产乱 | 欧美激情综合在线| 懂色av一区二区夜夜嗨| 中文字幕免费观看一区| 成人91在线观看| 亚洲欧美在线另类| 在线观看视频一区二区欧美日韩| 亚洲欧美日韩一区二区三区在线观看| 成人国产一区二区三区精品| 欧美韩国一区二区| 在线亚洲高清视频| 日本不卡在线视频| 久久久99免费| 99精品国产99久久久久久白柏| 亚洲午夜一二三区视频| 污片在线观看一区二区| 午夜影院在线观看欧美| 日韩免费高清电影| 99久久久国产精品| 亚洲成人自拍网| 国产午夜精品福利| 欧美视频精品在线观看| 国产福利精品导航| 亚洲综合一二三区| 日韩欧美卡一卡二| 色老汉一区二区三区| 久久精品国产精品亚洲精品 | 久久久91精品国产一区二区精品 | 精品国产91九色蝌蚪| 91久久精品午夜一区二区| 男人操女人的视频在线观看欧美| 日本一二三不卡| 欧美一级片在线观看| 91久久人澡人人添人人爽欧美 | 青青草国产精品亚洲专区无| 国产精品伦一区二区三级视频| 欧美日韩另类一区| 成人综合在线观看| 天天影视色香欲综合网老头| 亚洲嫩草精品久久| 国产精品入口麻豆九色| 精品三级在线观看| 91精品国产色综合久久久蜜香臀| 91亚洲国产成人精品一区二三| 韩日精品视频一区| 精品亚洲porn| 精品中文av资源站在线观看| 午夜一区二区三区视频| 一区二区三区四区不卡在线 |