> fine, but please fix those horrible
> - if ( x )
> and
> if ( y ) {
> empty line
>
> }
>
> syntaxes.
I hate to bother, but could you be more specific? Does it mean
you prefer 'if(x)' over if( x )? The empty line I get.
Attached is a new DVDFileStat patch w/ the whitespace
removed and the parens format made to match that of the
functions on either side of the newly add functions.
I am assuming that since niether Diego or Nico has said
anything else about the other three patches, that they are
generally OK.
E
--
Erik Hovland
[email protected]
http://hovland.org/
From 9da614ca39a05f33b558e7daf1c5105b032a1ae2 Mon Sep 17 00:00:00 2001
From: Erik Hovland <[email protected]>
Date: Sun, 30 Aug 2009 15:26:20 -0700
Subject: [PATCH] Add DVD file stat from version 0.9.7 to libdvdread
A new function to do an informational read of the dvd file handle was
introduced to libdvdread 0.9.7 (or was it .6). Since libdvdread at
mplayerhq imported an older version of dvdread/dvdnav this part of
the API was not available. This commit places that function into
the library making this library complete in reference to 0.9.7.
diff --git a/src/dvd_reader.c b/src/dvd_reader.c
index eb0ad8b..7f72140 100644
--- a/src/dvd_reader.c
+++ b/src/dvd_reader.c
@@ -111,6 +111,12 @@ struct dvd_file_s {
ssize_t filesize;
};
+struct dvd_stat_s {
+ off_t size; /**< Total size of file in bytes */
+ int nr_parts; /**< Number of file parts */
+ off_t parts_size[9]; /**< Size of each part in bytes */
+};
+
int UDFReadBlocksRaw( dvd_reader_t *device, uint32_t lb_number,
size_t block_count, unsigned char *data,
int encrypted );
@@ -882,9 +888,7 @@ void DVDCloseFile( dvd_file_t *dvd_file )
int i;
if( dvd_file ) {
- if( dvd_file->dvd->isImageFile ) {
- ;
- } else {
+ if( !dvd_file->dvd->isImageFile ) {
for( i = 0; i < TITLES_MAX; ++i ) {
if( dvd_file->title_devs[ i ] ) {
dvdinput_close( dvd_file->title_devs[i] );
@@ -897,6 +901,180 @@ void DVDCloseFile( dvd_file_t *dvd_file )
}
}
+static int DVDFileStatVOBUDF( dvd_reader_t *dvd, int title,
+ int menu, dvd_stat_t *statbuf )
+{
+ char filename[ MAX_UDF_FILE_NAME_LEN ];
+ uint32_t size;
+ off_t tot_size;
+ off_t parts_size[ 9 ];
+ int nr_parts = 0;
+ int n;
+
+ if( title == 0 )
+ sprintf( filename, "/VIDEO_TS/VIDEO_TS.VOB" );
+ else
+ sprintf( filename, "/VIDEO_TS/VTS_%02d_%d.VOB", title, menu ? 0 : 1 );
+
+ if( !UDFFindFile( dvd, filename, &size ) )
+ return -1;
+
+ tot_size = size;
+ nr_parts = 1;
+ parts_size[ 0 ] = size;
+
+ if( !menu ) {
+ int cur;
+
+ for( cur = 2; cur < 10; cur++ ) {
+ sprintf( filename, "/VIDEO_TS/VTS_%02d_%d.VOB", title, cur );
+ if( !UDFFindFile( dvd, filename, &size ) )
+ break;
+
+ parts_size[ nr_parts ] = size;
+ tot_size += size;
+ nr_parts++;
+ }
+ }
+
+ statbuf->size = tot_size;
+ statbuf->nr_parts = nr_parts;
+ for( n = 0; n < nr_parts; n++ )
+ statbuf->parts_size[ n ] = parts_size[ n ];
+
+ return 0;
+}
+
+
+static int DVDFileStatVOBPath( dvd_reader_t *dvd, int title,
+ int menu, dvd_stat_t *statbuf )
+{
+ char filename[ MAX_UDF_FILE_NAME_LEN ];
+ char full_path[ PATH_MAX + 1 ];
+ struct stat fileinfo;
+ off_t tot_size;
+ off_t parts_size[ 9 ];
+ int nr_parts = 0;
+ int n;
+
+ if( title == 0 )
+ sprintf( filename, "VIDEO_TS.VOB" );
+ else
+ sprintf( filename, "VTS_%02d_%d.VOB", title, menu ? 0 : 1 );
+
+ if( !findDVDFile( dvd, filename, full_path ) )
+ return -1;
+
+ if( stat( full_path, &fileinfo ) < 0 ) {
+ fprintf( stderr, "libdvdread: Can't stat() %s.\n", filename );
+ return -1;
+ }
+
+ tot_size = fileinfo.st_size;
+ nr_parts = 1;
+ parts_size[ 0 ] = fileinfo.st_size;
+
+ if( !menu ) {
+ int cur;
+ for( cur = 2; cur < 10; cur++ ) {
+ sprintf( filename, "VTS_%02d_%d.VOB", title, cur );
+ if( !findDVDFile( dvd, filename, full_path ) )
+ break;
+
+ if( stat( full_path, &fileinfo ) < 0 ) {
+ fprintf( stderr, "libdvdread: Can't stat() %s.\n", filename );
+ break;
+ }
+
+ parts_size[ nr_parts ] = fileinfo.st_size;
+ tot_size += parts_size[ nr_parts ];
+ nr_parts++;
+ }
+ }
+
+ statbuf->size = tot_size;
+ statbuf->nr_parts = nr_parts;
+ for( n = 0; n < nr_parts; n++ )
+ statbuf->parts_size[ n ] = parts_size[ n ];
+
+ return 0;
+}
+
+
+int DVDFileStat( dvd_reader_t *dvd, int titlenum,
+ dvd_read_domain_t domain, dvd_stat_t *statbuf )
+{
+ char filename[ MAX_UDF_FILE_NAME_LEN ];
+ char full_path[ PATH_MAX + 1 ];
+ struct stat fileinfo;
+ uint32_t size;
+
+ /* Check arguments. */
+ if( dvd == NULL || titlenum < 0 ) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ switch( domain ) {
+ case DVD_READ_INFO_FILE:
+ if( titlenum == 0 )
+ sprintf( filename, "/VIDEO_TS/VIDEO_TS.IFO" );
+ else
+ sprintf( filename, "/VIDEO_TS/VTS_%02i_0.IFO", titlenum );
+
+ break;
+ case DVD_READ_INFO_BACKUP_FILE:
+ if( titlenum == 0 )
+ sprintf( filename, "/VIDEO_TS/VIDEO_TS.BUP" );
+ else
+ sprintf( filename, "/VIDEO_TS/VTS_%02i_0.BUP", titlenum );
+
+ break;
+ case DVD_READ_MENU_VOBS:
+ if( dvd->isImageFile )
+ return DVDFileStatVOBUDF( dvd, titlenum, 1, statbuf );
+ else
+ return DVDFileStatVOBPath( dvd, titlenum, 1, statbuf );
+
+ break;
+ case DVD_READ_TITLE_VOBS:
+ if( titlenum == 0 )
+ return -1;
+
+ if( dvd->isImageFile )
+ return DVDFileStatVOBUDF( dvd, titlenum, 0, statbuf );
+ else
+ return DVDFileStatVOBPath( dvd, titlenum, 0, statbuf );
+
+ break;
+ default:
+ fprintf( stderr, "libdvdread: Invalid domain for file stat.\n" );
+ errno = EINVAL;
+ return -1;
+ }
+
+ if( dvd->isImageFile ) {
+ if( UDFFindFile( dvd, filename, &size ) ) {
+ statbuf->size = size;
+ statbuf->nr_parts = 1;
+ statbuf->parts_size[ 0 ] = size;
+ return 0;
+ }
+ } else {
+ if( findDVDFile( dvd, filename, full_path ) ) {
+ if( stat( full_path, &fileinfo ) < 0 )
+ fprintf( stderr, "libdvdread: Can't stat() %s.\n", filename );
+ else {
+ statbuf->size = fileinfo.st_size;
+ statbuf->nr_parts = 1;
+ statbuf->parts_size[ 0 ] = statbuf->size;
+ return 0;
+ }
+ }
+ }
+ return -1;
+}
+
/* Internal, but used from dvd_udf.c */
int UDFReadBlocksRaw( dvd_reader_t *device, uint32_t lb_number,
size_t block_count, unsigned char *data,
diff --git a/src/dvdread/dvd_reader.h b/src/dvdread/dvd_reader.h
index 8a2a58d..a938bb1 100644
--- a/src/dvdread/dvd_reader.h
+++ b/src/dvdread/dvd_reader.h
@@ -70,6 +70,11 @@ typedef struct dvd_reader_s dvd_reader_t;
typedef struct dvd_file_s dvd_file_t;
/**
+ * Opaque type that is used to provide statistics on a handle.
+ */
+typedef struct dvd_stat_s dvd_stat_t;
+
+/**
* Opens a block device of a DVD-ROM file, or an image file, or a directory
* name for a mounted DVD or HD copy of a DVD.
*
@@ -117,6 +122,33 @@ typedef enum {
} dvd_read_domain_t;
/**
+ * Stats a file on the DVD given the title number and domain.
+ * The information about the file is stored in a dvd_stat_t
+ * which contains information about the size of the file and
+ * the number of parts in case of a multipart file and the respective
+ * sizes of the parts.
+ * A multipart file is for instance VTS_02_1.VOB, VTS_02_2.VOB, VTS_02_3.VOB
+ * The size of VTS_02_1.VOB will be stored in stat->parts_size[0],
+ * VTS_02_2.VOB in stat->parts_size[1], ...
+ * The total size (sum of all parts) is stored in stat->size and
+ * stat->nr_parts will hold the number of parts.
+ * Only DVD_READ_TITLE_VOBS (VTS_??_[1-9].VOB) can be multipart files.
+ *
+ * This function is only of use if you want to get the size of each file
+ * in the filesystem. These sizes are not needed to use any other
+ * functions in libdvdread.
+ *
+ * @param dvd A dvd read handle.
+ * @param titlenum Which Video Title Set should be used, VIDEO_TS is 0.
+ * @param domain Which domain.
+ * @param stat Pointer to where the result is stored.
+ * @return If successful 0, otherwise -1.
+ *
+ * int DVDFileStat(dvd, titlenum, domain, stat);
+ */
+int DVDFileStat(dvd_reader_t *, int, dvd_read_domain_t, dvd_stat_t *);
+
+/**
* Opens a file on the DVD given the title number and domain.
*
* If the title number is 0, the video manager information is opened
--
1.6.0.4
_______________________________________________
DVDnav-discuss mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/dvdnav-discuss