⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrg.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 3 页
字号:
		      env->dtyp);	    track_format = TRACK_FORMAT_AUDIO;	  }	  if (0 == form2) {	    int i;	    for (i=0; i<env->gen.i_tracks; i++) {	      cdtext_init (&(env->gen.cdtext_track[i]));	      env->tocent[i].track_format= track_format;	      env->tocent[i].datastart   = 0;	      env->tocent[i].track_green = false;	      if (TRACK_FORMAT_AUDIO == track_format) {		env->tocent[i].blocksize   = CDIO_CD_FRAMESIZE_RAW;		env->tocent[i].datasize    = CDIO_CD_FRAMESIZE_RAW;		env->tocent[i].endsize     = 0;	      } else {		env->tocent[i].datasize    = CDIO_CD_FRAMESIZE;		env->tocent[i].datastart  =  0;	      }	    }	  } else if (2 == form2) {	    int i;	    for (i=0; i<env->gen.i_tracks; i++) {	      cdtext_init (&(env->gen.cdtext_track[i]));	      env->tocent[i].track_green = true;	      env->tocent[i].track_format= track_format;	      env->tocent[i].datasize    = CDIO_CD_FRAMESIZE;	      if (TRACK_FORMAT_XA == track_format) {		env->tocent[i].datastart   = CDIO_CD_SYNC_SIZE 		  + CDIO_CD_HEADER_SIZE + CDIO_CD_SUBHEADER_SIZE;		env->tocent[i].endsize     = CDIO_CD_SYNC_SIZE 		  + CDIO_CD_ECC_SIZE;	      } else {		env->tocent[i].datastart   = CDIO_CD_SYNC_SIZE 		  + CDIO_CD_HEADER_SIZE;		env->tocent[i].endsize     = CDIO_CD_EDC_SIZE 		  + CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE;	      	      }	    }	  } else {	    cdio_log (log_level, "Don't know if form1 or form2 form2: %x\n", 		      form2);	  }	  break;	}      case NERO_ID:       case NER5_ID: 	cdio_error ("unexpected nrg magic ID NER%c detected",		    opcode==NERO_ID ? 'O': '5');	free(footer_buf);	return false;	break;      case END1_ID: /* "END!" */	cdio_debug ("nrg end tag detected");	break_out = true;	break;	      case ETNF_ID: /* "ETNF" */ {	unsigned entries = UINT32_FROM_BE (chunk->len);	_etnf_array_t *_entries = (void *) chunk->data;		cdio_assert (env->mapping == NULL);		cdio_assert ( sizeof (_etnf_array_t) == 20 );	cdio_assert ( UINT32_FROM_BE(chunk->len) % sizeof(_etnf_array_t) 		      == 0 );		entries /= sizeof (_etnf_array_t);		cdio_info ("SAO type image (ETNF) detected");		{	  int idx;	  for (idx = 0; idx < entries; idx++) {	    uint32_t _len = UINT32_FROM_BE (_entries[idx].length);	    uint32_t _start = UINT32_FROM_BE (_entries[idx].start_lsn);	    uint32_t _start2 = UINT32_FROM_BE (_entries[idx].start);	    uint32_t track_mode= uint32_from_be (_entries[idx].type);	    bool     track_green = true;	    track_format_t track_format = TRACK_FORMAT_XA;	    uint16_t  blocksize;     	    	    switch (track_mode) {	    case 0:	      /* Mode 1 */	      track_format   = TRACK_FORMAT_DATA;	      track_green    = false; /* ?? */	      blocksize      = CDIO_CD_FRAMESIZE;	      env->disc_mode = CDIO_DISC_MODE_CD_DATA;	      break;	    case 2:	      /* Mode 2 form 1 */	      track_format   = TRACK_FORMAT_XA;	      track_green    = false; /* ?? */	      blocksize      = CDIO_CD_FRAMESIZE;	      env->disc_mode = CDIO_DISC_MODE_CD_XA;	      break;	    case 3:	      /* Mode 2 */	      track_format   = TRACK_FORMAT_XA;	      track_green    = true;	      blocksize      = M2RAW_SECTOR_SIZE;	      env->disc_mode = CDIO_DISC_MODE_CD_XA; /* ?? */	      break;	    case 06:	      /* Mode2 form mix */	      track_format   = TRACK_FORMAT_XA;	      track_green    = true;	      blocksize      = M2RAW_SECTOR_SIZE;	      env->disc_mode = CDIO_DISC_MODE_CD_MIXED;	      break;	    case 0x20: /* ??? Mode2 form 2, Mode2 raw?? */	      track_format   = TRACK_FORMAT_XA;	      track_green    = true;	      blocksize      = M2RAW_SECTOR_SIZE;	      env->disc_mode = CDIO_DISC_MODE_CD_XA; /* ??. */	      break;	    case 7:	      track_format   = TRACK_FORMAT_AUDIO;	      track_green    = false;	      blocksize      = CDIO_CD_FRAMESIZE_RAW;	      env->disc_mode = CDIO_DISC_MODE_CD_DA;	      break;	    default:	      cdio_log (log_level, 			"Don't know how to handle track mode (%lu)?",			(long unsigned int) track_mode);	      free(footer_buf);	      return false;	    }	    	    cdio_assert (_len % blocksize == 0);	    	    _len /= blocksize;	    	    cdio_assert (_start * blocksize == _start2);	    	    _start += idx * CDIO_PREGAP_SECTORS;	    _register_mapping (env, _start, _len, _start2, blocksize,			       track_format, track_green, 0);	  }	}	break;      }            case ETN2_ID: { /* "ETN2", same as above, but with 64bit stuff instead */	unsigned entries = uint32_from_be (chunk->len);	_etn2_array_t *_entries = (void *) chunk->data;		cdio_assert (env->mapping == NULL);		cdio_assert (sizeof (_etn2_array_t) == 32);	cdio_assert (uint32_from_be (chunk->len) % sizeof (_etn2_array_t) == 0);		entries /= sizeof (_etn2_array_t);		cdio_info ("SAO type image (ETN2) detected");	{	  int idx;	  for (idx = 0; idx < entries; idx++) {	    uint32_t _len = uint64_from_be (_entries[idx].length);	    uint32_t _start = uint32_from_be (_entries[idx].start_lsn);	    uint32_t _start2 = uint64_from_be (_entries[idx].start);	    uint32_t track_mode= uint32_from_be (_entries[idx].type);	    bool     track_green = true;	    track_format_t track_format = TRACK_FORMAT_XA;	    uint16_t  blocksize;     	    switch (track_mode) {	    case 0:	      track_format = TRACK_FORMAT_DATA;	      track_green  = false; /* ?? */	      blocksize    = CDIO_CD_FRAMESIZE;	      break;	    case 2:	      track_format = TRACK_FORMAT_XA;	      track_green  = false; /* ?? */	      blocksize    = CDIO_CD_FRAMESIZE;	      break;	    case 3:	      track_format = TRACK_FORMAT_XA;	      track_green  = true;	      blocksize    = M2RAW_SECTOR_SIZE;	      break;	    case 7:	      track_format = TRACK_FORMAT_AUDIO;	      track_green  = false;	      blocksize    = CDIO_CD_FRAMESIZE_RAW;	      break;	    default:	      cdio_log (log_level, 			"Don't know how to handle track mode (%lu)?",			(long unsigned int) track_mode);	      free(footer_buf);	      return false;	    }	    	    if (_len % blocksize != 0) {	      cdio_log (log_level, 			"length is not a multiple of blocksize " 			 "len %lu, size %d, rem %lu", 			 (long unsigned int) _len, blocksize, 			 (long unsigned int) _len % blocksize);	      if (0 == _len % CDIO_CD_FRAMESIZE) {		cdio_log(log_level, "Adjusting blocksize to %d", 			 CDIO_CD_FRAMESIZE);		blocksize = CDIO_CD_FRAMESIZE;	      } else if (0 == _len % M2RAW_SECTOR_SIZE) {		cdio_log(log_level,			 "Adjusting blocksize to %d", M2RAW_SECTOR_SIZE);		blocksize = M2RAW_SECTOR_SIZE;	      } else if (0 == _len % CDIO_CD_FRAMESIZE_RAW) {		cdio_log(log_level, 			 "Adjusting blocksize to %d", CDIO_CD_FRAMESIZE_RAW);		blocksize = CDIO_CD_FRAMESIZE_RAW;	      }	    }	    	    _len /= blocksize;	    	    if (_start * blocksize != _start2) {	      cdio_log (log_level,			"%lu * %d != %lu", 			 (long unsigned int) _start, blocksize, 			 (long unsigned int) _start2);	      if (_start * CDIO_CD_FRAMESIZE == _start2) {		cdio_log(log_level,			 "Adjusting blocksize to %d", CDIO_CD_FRAMESIZE);		blocksize = CDIO_CD_FRAMESIZE;	      } else if (_start * M2RAW_SECTOR_SIZE == _start2) {		cdio_log(log_level,			 "Adjusting blocksize to %d", M2RAW_SECTOR_SIZE);		blocksize = M2RAW_SECTOR_SIZE;	      } else if (_start * CDIO_CD_FRAMESIZE_RAW == _start2) {		cdio_log(log_level,			 "Adjusting blocksize to %d", CDIO_CD_FRAMESIZE_RAW);		blocksize = CDIO_CD_FRAMESIZE_RAW;	      }	    }	    	    _start += idx * CDIO_PREGAP_SECTORS;	    _register_mapping (env, _start, _len, _start2, blocksize,			       track_format, track_green, 0);	  }	}	break;      }	      case SINF_ID: { /* "SINF" */		uint32_t *_sessions = (void *) chunk->data;		cdio_assert (UINT32_FROM_BE (chunk->len) == 4);		cdio_debug ("SINF: %lu sessions", 		    (long unsigned int) UINT32_FROM_BE (*_sessions));      }	break;	      case MTYP_ID: { /* "MTYP" */	uint32_t *mtyp_p = (void *) chunk->data;	uint32_t mtyp  = UINT32_FROM_BE (*mtyp_p);		cdio_assert (UINT32_FROM_BE (chunk->len) == 4);	cdio_debug ("MTYP: %lu", 		    (long unsigned int) UINT32_FROM_BE (*mtyp_p));	if (mtyp != MTYP_AUDIO_CD) {	  cdio_log (log_level,		    "Unknown MTYP value: %u", (unsigned int) mtyp);	}	env->mtyp = mtyp;      }	break;	      case CDTX_ID: { /* "CD TEXT" */		cdio_log (log_level,		  "Don't know how to handle CD TEXT yet" );	break;      }      default:	cdio_log (log_level,		  "unknown tag %8.8x seen", 		  (unsigned int) UINT32_FROM_BE (chunk->id));	break;      }	      if (break_out)	break;            pos += 8;      pos += UINT32_FROM_BE (chunk->len);    }  }  /* Fake out leadout track. */  /* Don't use _stat_size_nrg since that will lead to recursion since     we haven't fully initialized things yet.  */  cdio_lsn_to_msf (env->size, &env->tocent[env->gen.i_tracks].start_msf);  env->tocent[env->gen.i_tracks].start_lba = cdio_lsn_to_lba(env->size);  env->tocent[env->gen.i_tracks-1].sec_count =     cdio_lsn_to_lba(env->size - env->tocent[env->gen.i_tracks-1].start_lba);  env->gen.b_cdtext_init  = true;  env->gen.b_cdtext_error = false;  env->gen.toc_init       = true;  free(footer_buf);  return true;}/*!  Initialize image structures. */static bool_init_nrg (_img_private_t *env){  if (env->gen.init) {    cdio_error ("init called more than once");    return false;  }    if (!(env->gen.data_source = cdio_stdio_new (env->gen.source_name))) {    cdio_warn ("can't open nrg image file %s for reading", 	       env->gen.source_name);    return false;  }  env->psz_mcn       = NULL;  env->disc_mode     = CDIO_DISC_MODE_NO_INFO;  cdtext_init (&(env->gen.cdtext));  if ( !parse_nrg (env, env->gen.source_name) ) {    cdio_warn ("image file %s is not a Nero image", 	       env->gen.source_name);    return false;  }    env->gen.init = true;  return true;}/*!  Reads into buf the next size bytes.  Returns -1 on error.   Would be libc's seek() but we have to adjust for the extra track header   information in each sector.*/static off_t_lseek_nrg (void *user_data, off_t offset, int whence){  _img_private_t *env = user_data;  /* real_offset is the real byte offset inside the disk image     The number below was determined empirically.   */  off_t real_offset= env->is_dao ? 0x4b000 : 0;  unsigned int i;  for (i=0; i<env->gen.i_tracks; i++) {    track_info_t  *this_track=&(env->tocent[i]);    env->pos.index = i;    if ( (this_track->sec_count*this_track->datasize) >= offset) {      int blocks            = offset / this_track->datasize;      int rem               = offset % this_track->datasize;      int block_offset      = blocks * this_track->blocksize;      real_offset          += block_offset + rem;      env->pos.buff_offset = rem;      env->pos.lba        += blocks;      break;    }    real_offset   += this_track->sec_count*this_track->blocksize;    offset        -= this_track->sec_count*this_track->datasize;    env->pos.lba += this_track->sec_count;  }  if (i==env->gen.i_tracks) {    cdio_warn ("seeking outside range of disk image");    return -1;  } else    real_offset += env->tocent[i].datastart;    return cdio_stream_seek(env->gen.data_source, real_offset, whence);}/*!  Reads into buf the next size bytes.  Returns -1 on error.   FIXME:    At present we assume a read doesn't cross sector or track   boundaries.*/static ssize_t_read_nrg (void *user_data, void *buf, size_t size){  _img_private_t *env = user_data;  return cdio_stream_read(env->gen.data_source, buf, size, 1);}static uint32_t _stat_size_nrg (void *user_data){  _img_private_t *env = user_data;  return env->size;}/*!   Reads a single audio sector from CD device into data starting   from LSN. Returns 0 if no error.  */static int_read_audio_sectors_nrg (void *user_data, void *data, lsn_t lsn, 			  unsigned int nblocks){  _img_private_t *env = user_data;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -