Mercurial > mplayer.hg
changeset 8812:f6456b177fdc
vcd_read_cue.h -> cue_read.c+h
author | arpi |
---|---|
date | Sun, 05 Jan 2003 23:51:05 +0000 |
parents | c72c8f6416e7 |
children | bba27bc43b0d |
files | libmpdemux/Makefile libmpdemux/cue_read.c libmpdemux/cue_read.h libmpdemux/open.c libmpdemux/stream.c libmpdemux/vcd_read_bincue.h |
diffstat | 6 files changed, 23 insertions(+), 514 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpdemux/Makefile Sun Jan 05 21:42:27 2003 +0000 +++ b/libmpdemux/Makefile Sun Jan 05 23:51:05 2003 +0000 @@ -3,7 +3,7 @@ include ../config.mak -SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_pva.c demux_viv.c demuxer.c dvdauth.c dvdnav_stream.c open.c parse_es.c stream.c tv.c tvi_dummy.c tvi_v4l.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c demux_bmp.c cdda.c demux_rawaudio.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_oss.c audio_in.c demux_smjpeg.c +SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_pva.c demux_viv.c demuxer.c dvdauth.c dvdnav_stream.c open.c parse_es.c stream.c tv.c tvi_dummy.c tvi_v4l.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c demux_bmp.c cdda.c demux_rawaudio.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_oss.c audio_in.c demux_smjpeg.c cue_read.c ifeq ($(XMMS_PLUGINS),yes) SRCS += demux_xmms.c endif
--- a/libmpdemux/cue_read.c Sun Jan 05 21:42:27 2003 +0000 +++ b/libmpdemux/cue_read.c Sun Jan 05 23:51:05 2003 +0000 @@ -7,8 +7,16 @@ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> +#include <fcntl.h> #include <libgen.h> +#include "config.h" +#include "mp_msg.h" +//#include "help_mp.h" + +#include "stream.h" + +#include "cue_read.h" #define byte unsigned char #define SIZERAW 2352 @@ -241,7 +249,7 @@ cue_current_pos.frame); } -static inline void cue_set_msf(unsigned int sect){ +inline void cue_set_msf(unsigned int sect){ cue_current_pos.frame=sect%75; sect=sect/75; cue_current_pos.second=sect%60; @@ -486,7 +494,7 @@ static char vcd_buf[VCD_SECTOR_SIZE]; -static int cue_vcd_read(char *mem){ +int cue_vcd_read(char *mem){ if (cue_read_raw(vcd_buf)==-1) return 0; // EOF?
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpdemux/cue_read.h Sun Jan 05 23:51:05 2003 +0000 @@ -0,0 +1,7 @@ + +int cue_read_cue (char *in_cue_filename); +int cue_vcd_seek_to_track (int track); +int cue_vcd_get_track_end (int track); +void cue_vcd_read_toc (); +int cue_vcd_read(char *mem); +inline void cue_set_msf(unsigned int sect);
--- a/libmpdemux/open.c Sun Jan 05 21:42:27 2003 +0000 +++ b/libmpdemux/open.c Sun Jan 05 23:51:05 2003 +0000 @@ -67,10 +67,8 @@ #endif extern int vcd_get_track_end(int fd,int track); -extern int cue_read_cue (const char *); -extern int cue_vcd_seek_to_track (int track); -extern int cue_vcd_get_track_end (int track); -extern void cue_vcd_read_toc (); + +#include "cue_read.h" #ifdef USE_TV #include "tv.h"
--- a/libmpdemux/stream.c Sun Jan 05 21:42:27 2003 +0000 +++ b/libmpdemux/stream.c Sun Jan 05 23:51:05 2003 +0000 @@ -20,6 +20,8 @@ extern int verbose; // defined in mplayer.c +#include "cue_read.h" + #ifdef HAVE_VCD #ifdef __FreeBSD__ @@ -32,7 +34,7 @@ #endif -#include "vcd_read_bincue.h" +//#include "vcd_read_bincue.h" #ifdef USE_DVDREAD int dvd_read_sector(dvd_priv_t *d,unsigned char* data);
--- a/libmpdemux/vcd_read_bincue.h Sun Jan 05 21:42:27 2003 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,506 +0,0 @@ -//=================== VideoCD BinCue ========================== - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <libgen.h> - - -#define byte unsigned char -#define SIZERAW 2352 -#define SIZEISO_MODE1 2048 -#define SIZEISO_MODE2_RAW 2352 -#define SIZEISO_MODE2_FORM1 2048 -#define SIZEISO_MODE2_FORM2 2336 -#define AUDIO 0 -#define MODE1 1 -#define MODE2 2 -#define MODE1_2352 10 -#define MODE2_2352 20 -#define MODE1_2048 30 -#define MODE2_2336 40 -#define UNKNOWN -1 - - -static FILE* fd_cue; -static int fd_bin = 0; - -static char bin_filename[256]; - -static char cue_filename[256]; -static char bincue_path[256]; - - -typedef struct track -{ - unsigned short mode; - unsigned short minute; - unsigned short second; - unsigned short frame; - - /* (min*60 + sec) * 75 + fps */ - - unsigned long start_sector; - - /* = the sizes in bytes off all tracks bevor this one */ - /* its needed if there are mode1 tracks befor the mpeg tracks */ - unsigned long start_offset; - - /* unsigned char num[3]; */ -} tTrack; - -/* max 99 tracks on a cd */ -static tTrack tracks[100]; - -static struct cue_track_pos { - int track; - unsigned short mode; - unsigned short minute; - unsigned short second; - unsigned short frame; -} cue_current_pos; - -/* number of tracks on the cd */ -static int nTracks = 0; - -/* presumes Line is preloaded with the "current" line of the file */ -int cue_getTrackinfo(char *Line, tTrack *track) -{ - char inum[3]; - char min; - char sec; - char fps; - int already_set = 0; - - /* Get the 'mode' */ - if (strncmp(&Line[2], "TRACK ", 6)==0) - { -/* strncpy(track->num, &Line[8], 2); track->num[2] = '\0'; */ - - track->mode = UNKNOWN; - if(strncmp(&Line[11], "AUDIO", 5)==0) track->mode = AUDIO; - if(strncmp(&Line[11], "MODE1/2352", 10)==0) track->mode = MODE1_2352; - if(strncmp(&Line[11], "MODE1/2048", 10)==0) track->mode = MODE1_2048; - if(strncmp(&Line[11], "MODE2/2352", 10)==0) track->mode = MODE2_2352; - if(strncmp(&Line[11], "MODE2/2336", 10)==0) track->mode = MODE2_2336; - } - else return(1); - - /* Get the track indexes */ - while(1) { - if(! fgets( Line, 256, fd_cue ) ) { break;} - - if (strncmp(&Line[2], "TRACK ", 6)==0) - { - /* next track starting */ - break; - } - - /* Track 0 or 1, take the first an get fill the values*/ - if (strncmp(&Line[4], "INDEX ", 6)==0) - { - /* check stuff here so if the answer is false the else stuff below won't be executed */ - strncpy(inum, &Line[10], 2); inum[2] = '\0'; - if ((already_set == 0) && - ((strcmp(inum, "00")==0) || (strcmp(inum, "01")==0))) - { - already_set = 1; - - min = ((Line[13]-'0')<<4) | (Line[14]-'0'); - sec = ((Line[16]-'0')<<4) | (Line[17]-'0'); - fps = ((Line[19]-'0')<<4) | (Line[20]-'0'); - - track->minute = (((min>>4)*10) + (min&0xf)); - track->second = (((sec>>4)*10) + (sec&0xf)); - track->frame = (((fps>>4)*10) + (fps&0xf)); - } - } - else if (strncmp(&Line[4], "PREGAP ", 7)==0) { ; /* ignore */ } - else if (strncmp(&Line[4], "FLAGS ", 6)==0) { ; /* ignore */ } - else mp_msg (MSGT_OPEN,MSGL_INFO, - "[bincue] Unexpected cuefile line: %s\n", Line); - } - return(0); -} - - - -int cue_find_bin (char *firstline) { - int i,j; - char s[256]; - char t[256]; - - /* get the filename out of that */ - /* 12345 6 */ - if (strncmp(firstline, "FILE \"",6)==0) - { - i = 0; - j = 0; - while ( firstline[6 + i] != '"') - { - bin_filename[j] = firstline[6 + i]; - - /* if I found a path info, than delete all bevor it */ - switch (bin_filename[j]) - { - case '\\': - j = 0; - break; - - case '/': - j = 0; - break; - - default: - j++; - } - i++; - } - bin_filename[j+1] = '\0'; - - } - - /* now try to open that file, without path */ - fd_bin = open (bin_filename, O_RDONLY); - if (fd_bin == -1) - { - mp_msg(MSGT_OPEN,MSGL_STATUS, "[bincue] bin filename tested: %s\n", - bin_filename); - - /* now try to find it with the path of the cue file */ - sprintf(s,"%s/%s",bincue_path, bin_filename); - fd_bin = open (s, O_RDONLY); - if (fd_bin == -1) - { - mp_msg(MSGT_OPEN,MSGL_STATUS, - "[bincue] bin filename tested: %s\n", s); - /* now I would say the whole filename is shit, build our own */ - strncpy(s, cue_filename, strlen(cue_filename) - 3 ); - s[strlen(cue_filename) - 3] = '\0'; - strcat(s, "bin"); - fd_bin = open (s, O_RDONLY); - if (fd_bin == -1) - { - mp_msg(MSGT_OPEN,MSGL_STATUS, - "[bincue] bin filename tested: %s\n", s); - - /* ok try it with path */ - sprintf(t,"%s/%s",bincue_path, s); - fd_bin = open (t, O_RDONLY); - if (fd_bin == -1) - { - mp_msg(MSGT_OPEN,MSGL_STATUS, - "[bincue] bin filename tested: %s\n",t); - /* now I would say the whole filename is shit, build our own */ - strncpy(s, cue_filename, strlen(cue_filename) - 3 ); - s[strlen(cue_filename) - 3] = '\0'; - strcat(s, "img"); - fd_bin = open (s, O_RDONLY); - if (fd_bin == -1) - { - mp_msg(MSGT_OPEN,MSGL_STATUS, - "[bincue] bin filename tested: %s \n", s); - /* ok try it with path */ - sprintf(t,"%s/%s",bincue_path, s); - fd_bin = open (t, O_RDONLY); - if (fd_bin == -1) - { - mp_msg(MSGT_OPEN,MSGL_STATUS, - "[bincue] bin filename tested: %s\n", s); - - /* I'll give up */ - mp_msg(MSGT_OPEN,MSGL_ERR, - "[bincue] couldn't find the bin file - giving up\n"); - return -1; - } - } - } else strcpy(bin_filename, t); - - } else strcpy(bin_filename, s); - - } else strcpy(bin_filename, s); - - } - - mp_msg(MSGT_OPEN,MSGL_INFO, - "[bincue] using bin file %s\n", bin_filename); - return 0; -} - -static inline int cue_msf_2_sector(int minute, int second, int frame) { - return frame + (second + minute * 60 ) * 75; -} - -static inline int cue_get_msf() { - return cue_msf_2_sector (cue_current_pos.minute, - cue_current_pos.second, - cue_current_pos.frame); -} - -static inline void cue_set_msf(unsigned int sect){ - cue_current_pos.frame=sect%75; - sect=sect/75; - cue_current_pos.second=sect%60; - sect=sect/60; - cue_current_pos.minute=sect; -} - -static inline int cue_mode_2_sector_size(int mode) -{ - switch (mode) - { - case AUDIO: return AUDIO; - case MODE1_2352: return SIZERAW; - case MODE1_2048: return SIZEISO_MODE1; - case MODE2_2352: return SIZEISO_MODE2_RAW; - case MODE2_2336: return SIZEISO_MODE2_FORM2; - - default: - mp_msg(MSGT_OPEN,MSGL_FATAL, - "[bincue] unknown mode for binfile. should not happen. aborting\n"); - abort(); - } - -} - - -int cue_read_cue (char *in_cue_filename) -{ - struct stat filestat; - char sLine[256]; - unsigned int sect; - char *s,*t; - int i; - - /* we have no tracks at the beginning */ - nTracks = 0; - - fd_bin = 0; - - /* split the filename into a path and filename part */ - s = strdup(in_cue_filename); - t = dirname(s); - printf ("dirname: %s\n", t); - strcpy(bincue_path,t); - - - /* no path at all? */ - if (strcmp(bincue_path, ".") == 0) { - printf ("bincue_path: %s\n", bincue_path); - strcpy(cue_filename,in_cue_filename); - } else { - strcpy(cue_filename,in_cue_filename + strlen(bincue_path) + 1); - } - - - - /* open the cue file */ - fd_cue = fopen (in_cue_filename, "r"); - if (fd_cue == NULL) - { - mp_msg(MSGT_OPEN,MSGL_ERR, - "[bincue] cannot open %s\n", in_cue_filename); - return -1; - } - - /* read the first line and hand it to find_bin, which will - test more than one possible name of the file */ - - if(! fgets( sLine, 256, fd_cue ) ) - { - mp_msg(MSGT_OPEN,MSGL_ERR, - "[bincue] error reading from %s\n", in_cue_filename); - fclose (fd_cue); - return -1; - } - - if (cue_find_bin(sLine)) { - fclose (fd_cue); - return -1; - } - - - /* now build the track list */ - /* red the next line and call our track finder */ - if(! fgets( sLine, 256, fd_cue ) ) - { - mp_msg(MSGT_OPEN,MSGL_ERR, - "[bincue] error reading from %s\n", in_cue_filename); - fclose (fd_cue); - return -1; - } - - while(!feof(fd_cue)) - { - if (cue_getTrackinfo(sLine, &tracks[nTracks++]) != 0) - { - mp_msg(MSGT_OPEN,MSGL_ERR, - "[bincue] error reading from %s\n", in_cue_filename); - fclose (fd_cue); - return -1; - } - } - - /* make a fake track with stands for the Lead out */ - if (fstat (fd_bin, &filestat) == -1) { - mp_msg(MSGT_OPEN,MSGL_ERR, - "[bincue] error getting size of bin file\n"); - fclose (fd_cue); - return -1; - } - - sect = filestat.st_size / 2352; - - tracks[nTracks].frame = sect%75; - sect=sect/75; - tracks[nTracks].second = sect%60; - sect=sect/60; - tracks[nTracks].minute = sect; - - - /* lets calculate the start sectors and offsets */ - for(i = 0; i <= nTracks; i++) - { - tracks[i].start_sector = cue_msf_2_sector(tracks[i].minute, - tracks[nTracks].second, - tracks[nTracks].frame); - - /* if we're the first track we don't need to offset of the one befor */ - if (i == 0) - { - /* was always 0 on my svcds, but who knows */ - tracks[0].start_offset = tracks[0].start_sector * - cue_mode_2_sector_size(tracks[0].mode); - } else - { - tracks[i].start_offset = tracks[i-1].start_offset + - (tracks[i].start_sector - tracks[i-1].start_sector) * - cue_mode_2_sector_size(tracks[i-1].mode); - } - } - - fclose (fd_cue); - - return fd_bin; -} - - - - -int cue_read_toc_entry() { - - int track = cue_current_pos.track - 1; - - /* check if its a valid track, if not return -1 */ - if (track >= nTracks) - return -1; - - - switch (tracks[track].mode) - { - case AUDIO: - cue_current_pos.mode = AUDIO; - break; - case MODE1_2352: - cue_current_pos.mode = MODE1; - break; - case MODE1_2048: - cue_current_pos.mode = MODE1; - break; - default: /* MODE2_2352 and MODE2_2336 */ - cue_current_pos.mode = MODE2; - } - cue_current_pos.minute = tracks[track].minute; - cue_current_pos.second = tracks[track].second; - cue_current_pos.frame = tracks[track].frame; - - return 0; -} - -int cue_read_raw(char *buf) { - int position; - int track = cue_current_pos.track - 1; - - /* get the mode of the bin file part and calc the positon */ - position = tracks[track].start_offset + - (cue_msf_2_sector(cue_current_pos.minute, - cue_current_pos.second, - cue_current_pos.frame) - - tracks[track].start_sector) - * cue_mode_2_sector_size(tracks[track].mode); - - /* check if the track is at its end*/ - if (position >= tracks[track+1].start_offset) - return -1; - - if (lseek (fd_bin, position, SEEK_SET) == -1) { - mp_msg(MSGT_OPEN,MSGL_ERR, - "[bincue] unexpected end of bin file\n"); - return -1; - } - - if (!read (fd_bin, buf, VCD_SECTOR_SIZE)) - return -1; - else - return VCD_SECTOR_DATA; -} - - - -int cue_vcd_seek_to_track (int track){ - cue_current_pos.track = track; - - if (cue_read_toc_entry ()) - return -1; - - return VCD_SECTOR_DATA * cue_get_msf(); -} - -int cue_vcd_get_track_end (int track){ - cue_current_pos.frame = tracks[track].frame; - cue_current_pos.second = tracks[track].second; - cue_current_pos.minute = tracks[track].minute; - - return VCD_SECTOR_DATA * cue_get_msf(); -} - -void cue_vcd_read_toc(){ - int i; - for (i = 0; i < nTracks; ++i) { - - mp_msg(MSGT_OPEN,MSGL_INFO, - "track %02d: format=%d %02d:%02d:%02d\n", - i, - tracks[i].mode, - tracks[i].minute, - tracks[i].second, - tracks[i].frame - ); - } -} - - -static char vcd_buf[VCD_SECTOR_SIZE]; - -static int cue_vcd_read(char *mem){ - - if (cue_read_raw(vcd_buf)==-1) return 0; // EOF? - - memcpy(mem,&vcd_buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA); - - cue_current_pos.frame++; - if (cue_current_pos.frame==75){ - cue_current_pos.frame=0; - cue_current_pos.second++; - if (cue_current_pos.second==60){ - cue_current_pos.second=0; - cue_current_pos.minute++; - } - } - - return VCD_SECTOR_DATA; -}