From b20e08ed94c850b419ed9b9e1736cf32da71afc7 Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 28 Feb 2010 15:24:30 +0000 Subject: Extend stream_read_line to support reading lines from UTF-16 encoded files and use this to support reading UTF-16 encoded subtitle files in subreader.c git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30799 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- stream/stream.h | 2 +- 2 files changed, 102 insertions(+), 6 deletions(-) (limited to 'stream') diff --git a/stream/stream.c b/stream/stream.c index 47d4b9e2a5..83cfdb02c8 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -41,6 +41,7 @@ #include "network.h" #include "stream.h" #include "libmpdemux/demuxer.h" +#include "libavutil/intreadwrite.h" #include "m_option.h" #include "m_struct.h" @@ -488,9 +489,103 @@ int stream_check_interrupt(int time) { return stream_check_interrupt_cb(time); } -unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max) { +/** + * Helper function to read 16 bits little-endian and advance pointer + */ +static uint16_t get_le16_inc(const uint8_t **buf) +{ + uint16_t v = AV_RL16(*buf); + *buf += 2; + return v; +} + +/** + * Helper function to read 16 bits big-endian and advance pointer + */ +static uint16_t get_be16_inc(const uint8_t **buf) +{ + uint16_t v = AV_RB16(*buf); + *buf += 2; + return v; +} + +/** + * Find a newline character in buffer + * \param buf buffer to search + * \param len amount of bytes to search in buffer, may not overread + * \param utf16 chose between UTF-8/ASCII/other and LE and BE UTF-16 + * 0 = UTF-8/ASCII/other, 1 = UTF-16-LE, 2 = UTF-16-BE + */ +static const uint8_t *find_newline(const uint8_t *buf, int len, int utf16) +{ + uint32_t c; + const uint8_t *end = buf + len; + switch (utf16) { + case 0: + return (uint8_t *)memchr(buf, '\n', len); + case 1: + while (buf < end - 1) { + GET_UTF16(c, buf < end - 1 ? get_le16_inc(&buf) : 0, return NULL;) + if (buf <= end && c == '\n') + return buf - 1; + } + break; + case 2: + while (buf < end - 1) { + GET_UTF16(c, buf < end - 1 ? get_be16_inc(&buf) : 0, return NULL;) + if (buf <= end && c == '\n') + return buf - 1; + } + break; + } + return NULL; +} + +/** + * Copy a number of bytes, converting to UTF-8 if input is UTF-16 + * \param dst buffer to copy to + * \param dstsize size of dst buffer + * \param src buffer to copy from + * \param len amount of bytes to copy from src + * \param utf16 chose between UTF-8/ASCII/other and LE and BE UTF-16 + * 0 = UTF-8/ASCII/other, 1 = UTF-16-LE, 2 = UTF-16-BE + */ +static int copy_characters(uint8_t *dst, int dstsize, + const uint8_t *src, int *len, int utf16) +{ + uint32_t c; + uint8_t *dst_end = dst + dstsize; + const uint8_t *end = src + *len; + switch (utf16) { + case 0: + if (*len > dstsize) + *len = dstsize; + memcpy(dst, src, *len); + return *len; + case 1: + while (src < end - 1 && dst_end - dst > 8) { + uint8_t tmp; + GET_UTF16(c, src < end - 1 ? get_le16_inc(&src) : 0, ;) + PUT_UTF8(c, tmp, *dst++ = tmp;) + } + *len -= end - src; + return dstsize - (dst_end - dst); + case 2: + while (src < end - 1 && dst_end - dst > 8) { + uint8_t tmp; + GET_UTF16(c, src < end - 1 ? get_be16_inc(&src) : 0, ;) + PUT_UTF8(c, tmp, *dst++ = tmp;) + } + *len -= end - src; + return dstsize - (dst_end - dst); + } + return 0; +} + +unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max, int utf16) { int len; - unsigned char* end,*ptr = mem; + const unsigned char *end; + unsigned char *ptr = mem; if (max < 1) return NULL; max--; // reserve one for 0-termination do { @@ -499,13 +594,14 @@ unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max) { if(len <= 0 && (!cache_stream_fill_buffer(s) || (len = s->buf_len-s->buf_pos) <= 0)) break; - end = (unsigned char*) memchr((void*)(s->buffer+s->buf_pos),'\n',len); + end = find_newline(s->buffer+s->buf_pos, len, utf16); if(end) len = end - (s->buffer+s->buf_pos) + 1; if(len > 0 && max > 0) { - int l = len > max ? max : len; - memcpy(ptr,s->buffer+s->buf_pos,l); + int l = copy_characters(ptr, max, s->buffer+s->buf_pos, &len, utf16); max -= l; ptr += l; + if (!len) + break; } s->buf_pos += len; } while(!end); diff --git a/stream/stream.h b/stream/stream.h index cc70c81db5..7774651611 100644 --- a/stream/stream.h +++ b/stream/stream.h @@ -265,7 +265,7 @@ inline static int stream_read(stream_t *s,char* mem,int total){ return total; } -unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max); +unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max, int utf16); inline static int stream_eof(stream_t *s){ return s->eof; -- cgit v1.2.3 From 7d48f09b39ff522977b27aee2c1a8867f28fd6cd Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 18:57:24 +0000 Subject: Use sizeof instead of hardcoded size. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30801 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 29139e74e8..5b5eb5fdb2 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -368,7 +368,7 @@ static int cue_read_cue (char *in_cue_filename) /* 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 ) ) + if(! fgets( sLine, sizeof(sLine), fd_cue ) ) { mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_MPDEMUX_CUEREAD_ErrReadingFromCueFile, in_cue_filename); @@ -384,7 +384,7 @@ static int cue_read_cue (char *in_cue_filename) /* now build the track list */ /* red the next line and call our track finder */ - if(! fgets( sLine, 256, fd_cue ) ) + if(! fgets( sLine, sizeof(sLine), fd_cue ) ) { mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_MPDEMUX_CUEREAD_ErrReadingFromCueFile, in_cue_filename); -- cgit v1.2.3 From 2a6755e10d7e48ab8886691d611bdc0aeb366572 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 19:20:32 +0000 Subject: Avoid code duplication and excessively deep nesting in cue_find_bin git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30802 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 69 +++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 37 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 5b5eb5fdb2..bfcf2b78ac 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -178,6 +178,7 @@ static int cue_getTrackinfo(char *Line, tTrack *track) * sure the sizes are in sync. */ static int cue_find_bin (char *firstline) { + const char *cur_name; int i,j; char s[256]; char t[256]; @@ -213,67 +214,61 @@ static int cue_find_bin (char *firstline) { } + fd_bin = -1; + for (i = 0; fd_bin == -1 && i < 6; i++) { + switch (i) { + case 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, MSGTR_MPDEMUX_CUEREAD_BinFilenameTested, - bin_filename); - + cur_name = bin_filename; + break; + case 1: /* now try to find it with the path of the cue file */ snprintf(s,sizeof( s ),"%s/%s",bincue_path,bin_filename); - fd_bin = open (s, O_RDONLY); - if (fd_bin == -1) - { - mp_msg(MSGT_OPEN,MSGL_STATUS, - MSGTR_MPDEMUX_CUEREAD_BinFilenameTested, s); + cur_name = s; + break; + case 2: /* 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, - MSGTR_MPDEMUX_CUEREAD_BinFilenameTested, s); - + cur_name = s; + break; + case 3: /* ok try it with path */ snprintf(t, sizeof( t ), "%s/%s", bincue_path, s); fd_bin = open (t, O_RDONLY); - if (fd_bin == -1) - { - mp_msg(MSGT_OPEN,MSGL_STATUS, - MSGTR_MPDEMUX_CUEREAD_BinFilenameTested,t); + cur_name = t; + break; + case 4: /* 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, - MSGTR_MPDEMUX_CUEREAD_BinFilenameTested, s); + cur_name = s; + break; + case 5: /* ok try it with path */ snprintf(t, sizeof( t ), "%s/%s", bincue_path, s); - fd_bin = open (t, O_RDONLY); + cur_name = t; + break; + } + fd_bin = open(cur_name, O_RDONLY); + if (fd_bin == -1) { + mp_msg(MSGT_OPEN,MSGL_STATUS, MSGTR_MPDEMUX_CUEREAD_BinFilenameTested, + cur_name); + } + } + if (fd_bin == -1) { - mp_msg(MSGT_OPEN,MSGL_STATUS, - MSGTR_MPDEMUX_CUEREAD_BinFilenameTested, s); - /* I'll give up */ mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_MPDEMUX_CUEREAD_CannotFindBinFile); return -1; } - } - } else strcpy(bin_filename, t); - - } else strcpy(bin_filename, s); - } else strcpy(bin_filename, s); - - } + if (cur_name != bin_filename) + strcpy(bin_filename, cur_name); mp_msg(MSGT_OPEN,MSGL_INFO, MSGTR_MPDEMUX_CUEREAD_UsingBinFile, bin_filename); -- cgit v1.2.3 From 2b91c7f04471a71c6dd6ee4df52cbc8bdc2acfc6 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 19:21:59 +0000 Subject: Reindent. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30803 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index bfcf2b78ac..9d94dd8dda 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -218,12 +218,12 @@ static int cue_find_bin (char *firstline) { for (i = 0; fd_bin == -1 && i < 6; i++) { switch (i) { case 0: - /* now try to open that file, without path */ + /* now try to open that file, without path */ cur_name = bin_filename; break; case 1: - /* now try to find it with the path of the cue file */ - snprintf(s,sizeof( s ),"%s/%s",bincue_path,bin_filename); + /* now try to find it with the path of the cue file */ + snprintf(s,sizeof( s ),"%s/%s",bincue_path,bin_filename); cur_name = s; break; case 2: @@ -234,21 +234,21 @@ static int cue_find_bin (char *firstline) { cur_name = s; break; case 3: - /* ok try it with path */ - snprintf(t, sizeof( t ), "%s/%s", bincue_path, s); - fd_bin = open (t, O_RDONLY); + /* ok try it with path */ + snprintf(t, sizeof( t ), "%s/%s", bincue_path, s); + fd_bin = open (t, O_RDONLY); cur_name = t; break; case 4: - /* 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"); + /* 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"); cur_name = s; break; case 5: - /* ok try it with path */ - snprintf(t, sizeof( t ), "%s/%s", bincue_path, s); + /* ok try it with path */ + snprintf(t, sizeof( t ), "%s/%s", bincue_path, s); cur_name = t; break; } @@ -259,13 +259,13 @@ static int cue_find_bin (char *firstline) { } } - if (fd_bin == -1) - { - /* I'll give up */ - mp_msg(MSGT_OPEN,MSGL_ERR, - MSGTR_MPDEMUX_CUEREAD_CannotFindBinFile); - return -1; - } + if (fd_bin == -1) + { + /* I'll give up */ + mp_msg(MSGT_OPEN,MSGL_ERR, + MSGTR_MPDEMUX_CUEREAD_CannotFindBinFile); + return -1; + } if (cur_name != bin_filename) strcpy(bin_filename, cur_name); -- cgit v1.2.3 From 3fc8335a862787c1457f49a302b7d73e62c0a700 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 19:25:52 +0000 Subject: Avoid a global variable and a strcpy. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30804 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 9d94dd8dda..6ff0667010 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -75,8 +75,6 @@ static const struct m_struct_st stream_opts = { static FILE* fd_cue; static int fd_bin = 0; -static char bin_filename[256]; - static char cue_filename[256]; static char bincue_path[256]; @@ -180,6 +178,7 @@ static int cue_getTrackinfo(char *Line, tTrack *track) static int cue_find_bin (char *firstline) { const char *cur_name; int i,j; + char bin_filename[256]; char s[256]; char t[256]; @@ -267,11 +266,8 @@ static int cue_find_bin (char *firstline) { return -1; } - if (cur_name != bin_filename) - strcpy(bin_filename, cur_name); - mp_msg(MSGT_OPEN,MSGL_INFO, - MSGTR_MPDEMUX_CUEREAD_UsingBinFile, bin_filename); + MSGTR_MPDEMUX_CUEREAD_UsingBinFile, cur_name); return 0; } -- cgit v1.2.3 From f2740450d3499ab48e58e24aeac1d93fd593b224 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 19:35:18 +0000 Subject: Avoid fd_bin and fd_cue global variables. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30805 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 6ff0667010..9431621f32 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -72,9 +72,6 @@ static const struct m_struct_st stream_opts = { stream_opts_fields }; -static FILE* fd_cue; -static int fd_bin = 0; - static char cue_filename[256]; static char bincue_path[256]; @@ -120,7 +117,7 @@ static int digits2int(char s[2], int errval) { } /* presumes Line is preloaded with the "current" line of the file */ -static int cue_getTrackinfo(char *Line, tTrack *track) +static int cue_getTrackinfo(FILE *fd_cue, char *Line, tTrack *track) { int already_set = 0; @@ -181,6 +178,7 @@ static int cue_find_bin (char *firstline) { char bin_filename[256]; char s[256]; char t[256]; + int fd_bin; /* get the filename out of that */ /* 12345 6 */ @@ -268,7 +266,7 @@ static int cue_find_bin (char *firstline) { mp_msg(MSGT_OPEN,MSGL_INFO, MSGTR_MPDEMUX_CUEREAD_UsingBinFile, cur_name); - return 0; + return fd_bin; } static inline int cue_msf_2_sector(int minute, int second, int frame) { @@ -315,12 +313,12 @@ static int cue_read_cue (char *in_cue_filename) unsigned int sect; char *s,*t; int i; + int fd_bin; + FILE *fd_cue; /* 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 = strrchr(s, '/'); @@ -367,7 +365,8 @@ static int cue_read_cue (char *in_cue_filename) return -1; } - if (cue_find_bin(sLine)) { + fd_bin = cue_find_bin(sLine); + if (fd_bin == -1) { fclose (fd_cue); return -1; } @@ -385,7 +384,7 @@ static int cue_read_cue (char *in_cue_filename) while(!feof(fd_cue)) { - if (cue_getTrackinfo(sLine, &tracks[nTracks++]) != 0) + if (cue_getTrackinfo(fd_cue, sLine, &tracks[nTracks++]) != 0) { mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_MPDEMUX_CUEREAD_ErrReadingFromCueFile, in_cue_filename); @@ -504,6 +503,7 @@ static void cue_vcd_read_toc(void){ static int cue_vcd_read(stream_t *stream, char *mem, int size) { unsigned long position; + int fd_bin = stream->fd; int track = cue_current_pos.track - 1; position = tracks[track].start_offset + -- cgit v1.2.3 From 592af7cd2c9c3ff1f0469924c0141dbfc912e6f9 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 19:57:42 +0000 Subject: Fix cue_vcd_get_track_end to not change the current position. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30806 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 9431621f32..81fa038648 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -479,11 +479,10 @@ static int cue_vcd_seek_to_track (int track){ } static 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; + int sector = cue_msf_2_sector(tracks[track].minute, tracks[track].second, + tracks[track].frame); - return VCD_SECTOR_DATA * cue_get_msf(); + return VCD_SECTOR_DATA * sector; } static void cue_vcd_read_toc(void){ -- cgit v1.2.3 From 686565165f7d50b3ef0ef7707171a9ef2baf861d Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 19:59:54 +0000 Subject: Implement cue:// track switching via chapter forward/backward like for audio CDs. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30807 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 81fa038648..35936117d1 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -545,6 +545,33 @@ static int seek(stream_t *s,off_t newpos) { return 1; } +static int control(stream_t *stream, int cmd, void *arg) { + switch(cmd) { + case STREAM_CTRL_GET_NUM_CHAPTERS: + { + *(unsigned int *)arg = nTracks; + return STREAM_OK; + } + case STREAM_CTRL_SEEK_TO_CHAPTER: + { + int r; + unsigned int track = *(unsigned int *)arg; + r = cue_vcd_seek_to_track(track); + if (r >= 0) { + stream->start_pos = r; + stream->end_pos = cue_vcd_get_track_end(track); + return STREAM_OK; + } + break; + } + case STREAM_CTRL_GET_CURRENT_CHAPTER: + { + *(unsigned int *)arg = cue_current_pos.track; + return STREAM_OK; + } + } + return STREAM_UNSUPPORTED; +} static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { struct stream_priv_s* p = (struct stream_priv_s*)opts; @@ -591,6 +618,7 @@ static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { stream->end_pos = ret2; stream->fill_buffer = cue_vcd_read; stream->seek = seek; + stream->control = control; free(filename); m_struct_free(&stream_opts,opts); -- cgit v1.2.3 From 4464a64ff783941c3472abd943d20c90b1038257 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 20:07:37 +0000 Subject: Fix cue_read_toc_entry to also reject negative track numbers git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30808 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 35936117d1..44e659b5f3 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -444,7 +444,7 @@ static int cue_read_toc_entry(void) { int track = cue_current_pos.track - 1; /* check if its a valid track, if not return -1 */ - if (track >= nTracks) + if (track < 0 || track >= nTracks) return -1; -- cgit v1.2.3 From 20fcc5c6ef76fea4b1f0f627170777e3fab8b950 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 20:11:11 +0000 Subject: Fix off-by-one error in chapter<->VCD track conversion. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30809 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 44e659b5f3..c356827782 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -555,7 +555,7 @@ static int control(stream_t *stream, int cmd, void *arg) { case STREAM_CTRL_SEEK_TO_CHAPTER: { int r; - unsigned int track = *(unsigned int *)arg; + unsigned int track = *(unsigned int *)arg + 1; r = cue_vcd_seek_to_track(track); if (r >= 0) { stream->start_pos = r; @@ -566,7 +566,7 @@ static int control(stream_t *stream, int cmd, void *arg) { } case STREAM_CTRL_GET_CURRENT_CHAPTER: { - *(unsigned int *)arg = cue_current_pos.track; + *(unsigned int *)arg = cue_current_pos.track - 1; return STREAM_OK; } } -- cgit v1.2.3 From ea139fadc1e714b2493d46ede57d3d52c36770db Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 20:20:13 +0000 Subject: Ensure that cue_current_pos.track is not set to an invalid value after attempting to seek to e.g. track 0. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30810 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index c356827782..0300e7c78e 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -439,15 +439,14 @@ static int cue_read_cue (char *in_cue_filename) -static int cue_read_toc_entry(void) { - - int track = cue_current_pos.track - 1; - +static int cue_read_toc_entry(int track) { /* check if its a valid track, if not return -1 */ - if (track < 0 || track >= nTracks) + if (track <= 0 || track > nTracks) return -1; + cue_current_pos.track = track; + track--; switch (tracks[track].mode) { case AUDIO: @@ -470,9 +469,7 @@ static int cue_read_toc_entry(void) { } static int cue_vcd_seek_to_track (int track){ - cue_current_pos.track = track; - - if (cue_read_toc_entry ()) + if (cue_read_toc_entry (track)) return -1; return VCD_SECTOR_DATA * cue_get_msf(); -- cgit v1.2.3 From 4b7c452ce875469ba2928f21ff5027c622b3387f Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 20:22:18 +0000 Subject: Set stream->pos correctly after seeking to a VCD title. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30811 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 1 + 1 file changed, 1 insertion(+) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 0300e7c78e..25193c5771 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -556,6 +556,7 @@ static int control(stream_t *stream, int cmd, void *arg) { r = cue_vcd_seek_to_track(track); if (r >= 0) { stream->start_pos = r; + stream->pos = r; stream->end_pos = cue_vcd_get_track_end(track); return STREAM_OK; } -- cgit v1.2.3 From 3ed38bacc49921af4f864013fbd8668f212f0936 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 20:31:56 +0000 Subject: Deduplicate code to set stream start_pos/end_pos. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30812 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 25193c5771..50e4688675 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -468,11 +468,19 @@ static int cue_read_toc_entry(int track) { return 0; } -static int cue_vcd_seek_to_track (int track){ +static int seek(stream_t *s,off_t newpos); +static int cue_vcd_get_track_end (int track); + +static int cue_vcd_seek_to_track (stream_t *stream, int track){ + int pos; if (cue_read_toc_entry (track)) return -1; - return VCD_SECTOR_DATA * cue_get_msf(); + pos = VCD_SECTOR_DATA * cue_get_msf(); + stream->start_pos = pos; + stream->end_pos = cue_vcd_get_track_end(track); + seek(stream, pos); + return pos; } static int cue_vcd_get_track_end (int track){ @@ -553,11 +561,8 @@ static int control(stream_t *stream, int cmd, void *arg) { { int r; unsigned int track = *(unsigned int *)arg + 1; - r = cue_vcd_seek_to_track(track); + r = cue_vcd_seek_to_track(stream, track); if (r >= 0) { - stream->start_pos = r; - stream->pos = r; - stream->end_pos = cue_vcd_get_track_end(track); return STREAM_OK; } break; @@ -573,7 +578,7 @@ static int control(stream_t *stream, int cmd, void *arg) { static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { struct stream_priv_s* p = (struct stream_priv_s*)opts; - int ret,ret2,f,track = 0; + int ret,f,track = 0; char *filename = NULL, *colon = NULL; if(mode != STREAM_READ || !p->filename) { @@ -600,20 +605,18 @@ static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { return STREAM_UNSUPPORTED; } cue_vcd_read_toc(); - ret2=cue_vcd_get_track_end(track); - ret=cue_vcd_seek_to_track(track); + ret=cue_vcd_seek_to_track(stream, track); if(ret<0){ mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (seek)\n"); return STREAM_UNSUPPORTED; } - mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_MPDEMUX_CUEREAD_CueStreamInfo_FilenameTrackTracksavail, filename, track, ret, ret2); + mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_MPDEMUX_CUEREAD_CueStreamInfo_FilenameTrackTracksavail, + filename, track, ret, (int)stream->end_pos); stream->fd = f; stream->type = STREAMTYPE_VCDBINCUE; stream->sector_size = VCD_SECTOR_DATA; stream->flags = STREAM_READ | MP_STREAM_SEEK_FW; - stream->start_pos = ret; - stream->end_pos = ret2; stream->fill_buffer = cue_vcd_read; stream->seek = seek; stream->control = control; -- cgit v1.2.3 From cd4aa2aa3068734f5355ee28cdd03482f7a30f99 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 20:33:47 +0000 Subject: Move functions into proper order to avoid extra declarations. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30813 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index 50e4688675..a4affeb192 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -468,8 +468,18 @@ static int cue_read_toc_entry(int track) { return 0; } -static int seek(stream_t *s,off_t newpos); -static int cue_vcd_get_track_end (int track); +static int cue_vcd_get_track_end (int track){ + int sector = cue_msf_2_sector(tracks[track].minute, tracks[track].second, + tracks[track].frame); + + return VCD_SECTOR_DATA * sector; +} + +static int seek(stream_t *s,off_t newpos) { + s->pos=newpos; + cue_set_msf(s->pos/VCD_SECTOR_DATA); + return 1; +} static int cue_vcd_seek_to_track (stream_t *stream, int track){ int pos; @@ -483,13 +493,6 @@ static int cue_vcd_seek_to_track (stream_t *stream, int track){ return pos; } -static int cue_vcd_get_track_end (int track){ - int sector = cue_msf_2_sector(tracks[track].minute, tracks[track].second, - tracks[track].frame); - - return VCD_SECTOR_DATA * sector; -} - static void cue_vcd_read_toc(void){ int i; for (i = 0; i < nTracks; ++i) { @@ -544,12 +547,6 @@ static int cue_vcd_read(stream_t *stream, char *mem, int size) { return VCD_SECTOR_DATA; } -static int seek(stream_t *s,off_t newpos) { - s->pos=newpos; - cue_set_msf(s->pos/VCD_SECTOR_DATA); - return 1; -} - static int control(stream_t *stream, int cmd, void *arg) { switch(cmd) { case STREAM_CTRL_GET_NUM_CHAPTERS: -- cgit v1.2.3 From 3fa6717fb9bbe871eaa36f8a6de5e39331422b55 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 20:38:33 +0000 Subject: Fix memleak due to strdup'd filename not being freed. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30814 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index a4affeb192..f19334edab 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -333,6 +333,8 @@ static int cue_read_cue (char *in_cue_filename) av_strlcpy(bincue_path,t,sizeof( bincue_path )); mp_msg(MSGT_OPEN,MSGL_V,"dirname: %s, cuepath: %s\n", t, bincue_path); + free(s); + s = t = NULL; /* no path at all? */ if (strcmp(bincue_path, ".") == 0) { -- cgit v1.2.3 From be23797ee7428e177b3476effb29beee4bfa7510 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 1 Mar 2010 21:09:17 +0000 Subject: Remove unused and useless define. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30815 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_cue.c | 1 - 1 file changed, 1 deletion(-) (limited to 'stream') diff --git a/stream/stream_cue.c b/stream/stream_cue.c index f19334edab..aa6dfd45b9 100644 --- a/stream/stream_cue.c +++ b/stream/stream_cue.c @@ -38,7 +38,6 @@ #include "m_struct.h" #include "libavutil/avstring.h" -#define byte unsigned char #define SIZERAW 2352 #define SIZEISO_MODE1 2048 #define SIZEISO_MODE2_RAW 2352 -- cgit v1.2.3