libbluray | branch: master | hpi1 <[email protected]> | Tue Dec 3 09:49:24 2013 +0200| [9d70bc774fa23608ecfd78e17d0daef2d50903cc] | committer: hpi1
Added file_size() > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=9d70bc774fa23608ecfd78e17d0daef2d50903cc --- src/file/file.h | 2 ++ src/file/file_posix.c | 18 ++++++++++++++++++ src/libbluray/bdj/bdjo_parser.c | 5 +---- src/libbluray/bdnav/meta_parse.c | 4 +--- src/libbluray/bluray.c | 8 ++++++-- src/util/bits.c | 12 +++++++++--- 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/file/file.h b/src/file/file.h index 5ee8c01..55340f7 100644 --- a/src/file/file.h +++ b/src/file/file.h @@ -41,11 +41,13 @@ #define file_eof(X) X->eof(X) #define file_read(X,Y,Z) (size_t)X->read(X,Y,Z) #define file_write(X,Y,Z) (size_t)X->write(X,Y,Z) +BD_PRIVATE int64_t file_size(BD_FILE_H *fp); BD_PRIVATE extern BD_FILE_H* (*file_open)(const char* filename, const char *mode); BD_PRIVATE BD_FILE_OPEN file_open_default(void); + /* * directory access */ diff --git a/src/file/file_posix.c b/src/file/file_posix.c index fec26ab..4bca744 100644 --- a/src/file/file_posix.c +++ b/src/file/file_posix.c @@ -138,3 +138,21 @@ BD_FILE_OPEN file_open_default(void) { return file_open_linux; } + +/* + * + */ + +int64_t file_size(BD_FILE_H *fp) +{ + int64_t pos = file_tell(fp); + int64_t res1 = file_seek(fp, 0, SEEK_END); + int64_t length = file_tell(fp); + int64_t res2 = file_seek(fp, pos, SEEK_SET); + + if (res1 < 0 || res2 < 0 || pos < 0 || length < 0) { + return -1; + } + + return length; +} diff --git a/src/libbluray/bdj/bdjo_parser.c b/src/libbluray/bdj/bdjo_parser.c index 0abb579..450046f 100644 --- a/src/libbluray/bdj/bdjo_parser.c +++ b/src/libbluray/bdj/bdjo_parser.c @@ -410,15 +410,12 @@ jobject bdjo_read(JNIEnv* env, const char* file) return NULL; } - file_seek(handle, 0, SEEK_END); - int64_t length = file_tell(handle); + int64_t length = file_size(handle); if (length <= 0 || length > MAX_BDJO_FILE_SIZE) { BD_DEBUG(DBG_BDJ | DBG_CRIT, "Error reading %s\n", file); } else { - file_seek(handle, 0, SEEK_SET); - size_t size = (size_t)length; uint8_t *data = malloc(size); size_t size_read = file_read(handle, data, size); diff --git a/src/libbluray/bdnav/meta_parse.c b/src/libbluray/bdnav/meta_parse.c index 77e36b0..dd3fc48 100644 --- a/src/libbluray/bdnav/meta_parse.c +++ b/src/libbluray/bdnav/meta_parse.c @@ -159,11 +159,9 @@ META_ROOT *meta_parse(const char *device_path) continue; } - file_seek(handle, 0, SEEK_END); - int64_t length = file_tell(handle); + int64_t length = file_size(handle); if (length > 0 && length < MAX_META_FILE_SIZE) { - file_seek(handle, 0, SEEK_SET); size_t size = (size_t)length; uint8_t *data = malloc(size); size_t size_read = file_read(handle, data, size); diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c index 0055ecd..8b93706 100644 --- a/src/libbluray/bluray.c +++ b/src/libbluray/bluray.c @@ -526,13 +526,17 @@ static int _open_m2ts(BLURAY *bd, BD_STREAM *st) st->fp = file_open(f_name, "rb"); X_FREE(f_name); + st->clip_size = 0; st->clip_pos = (uint64_t)st->clip->start_pkt * 192; st->clip_block_pos = (st->clip_pos / 6144) * 6144; if (st->fp) { - file_seek(st->fp, 0, SEEK_END); - if ((st->clip_size = file_tell(st->fp))) { + int64_t clip_size = file_size(st->fp); + if (clip_size > 0) { + file_seek(st->fp, st->clip_block_pos, SEEK_SET); + + st->clip_size = clip_size; st->int_buf_off = 6144; libaacs_select_title(bd->libaacs, bd_psr_read(bd->regs, PSR_TITLE_NUMBER)); diff --git a/src/util/bits.c b/src/util/bits.c index cdc4ae7..a3f45e2 100644 --- a/src/util/bits.c +++ b/src/util/bits.c @@ -22,6 +22,8 @@ #include "bits.h" +#include "util/logging.h" + #include <stdio.h> /** @@ -39,12 +41,16 @@ void bb_init( BITBUFFER *bb, uint8_t *p_data, size_t i_data ) void bs_init( BITSTREAM *bs, BD_FILE_H *fp ) { + int64_t size = file_size(fp);; bs->fp = fp; bs->pos = 0; - file_seek(bs->fp, 0, SEEK_END); - bs->end = file_tell(bs->fp); - file_seek(bs->fp, 0, SEEK_SET); + bs->end = (size < 0) ? 0 : size; bs->size = file_read(bs->fp, bs->buf, BF_BUF_SIZE); + if (bs->size == 0 || bs->size > BF_BUF_SIZE) { + bs->size = 0; + bs->end = 0; + BD_DEBUG(DBG_FILE|DBG_CRIT, "bs_init(): read error!\n"); + } bb_init(&bs->bb, bs->buf, bs->size); } _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
