[DVDnav-discuss] [PATCH] Fix DVDDiscID from reading non-existent IFO files
Jean-Baptiste Kempf
jb at videolan.org
Tue Feb 18 16:40:52 CET 2014
Hello,
Applied on the git repository.
Le 17/02/2014 01:14, Steve Dibb a écrit :
> First patch, and from a C noob even, so go easy on me. :)
>
> In dvd_reader.c, the DVDDiscID function gets the MD5 from the total contents
> of the IFO files on the disc. However, it gets it by looping through the
> the first ten IFO files, whether they exist or not.
>
> This results in spewage, where a disc has less than ten. In this case,
> Dragonheart only has two:
>
> libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_03_0.IFO failed
> libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_04_0.IFO failed
> libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_05_0.IFO failed
> libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_06_0.IFO failed
> libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_07_0.IFO failed
> libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_08_0.IFO failed
> libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_09_0.IFO failed
>
> Instead of using a set limit of 10 IFOs, this patch counts the number of
> VTSes existing on the DVD, and will use that number instead if it is less
> than 10.
>
> Also, doesn't break backwards compatability -- MD5 sum is the same before
> and after the patch. :)
>
> --- src/dvd_reader.c.orig 2014-02-16 15:39:51.890964032 -0700
> +++ src/dvd_reader.c 2014-02-16 16:37:42.269821221 -0700
> @@ -70,6 +70,7 @@
> #include "dvd_input.h"
> #include "dvdread/dvd_reader.h"
> #include "md5.h"
> +#include "dvdread/ifo_read.h"
>
> #define DEFAULT_UDF_CACHE_LEVEL 1
>
> @@ -1329,16 +1330,31 @@
> {
> struct md5_ctx ctx;
> int title;
> + int title_sets;
> int nr_of_files = 0;
> + ifo_handle_t *vmg_ifo;
>
> /* Check arguments. */
> if( dvd == NULL || discid == NULL )
> return 0;
>
> - /* Go through the first 10 IFO:s, in order,
> + vmg_ifo = ifoOpen( dvd, 0 );
> + if( !vmg_ifo ) {
> + fprintf( stderr, "libdvdread: DVDDiscId, failed to "
> + "open VMG IFO!\n" );
> + return -1;
> + }
> +
> + title_sets = vmg_ifo->vmgi_mat->vmg_nr_of_title_sets + 1;
> + ifoClose( vmg_ifo );
> +
> + if( title_sets > 10 )
> + title_sets = 10;
> +
> + /* Go through the first IFO:s, in order, up until the tenth,
> * and md5sum them, i.e VIDEO_TS.IFO and VTS_0?_0.IFO */
> md5_init_ctx( &ctx );
> - for( title = 0; title < 10; title++ ) {
> + for( title = 0; title < title_sets; title++ ) {
> dvd_file_t *dvd_file = DVDOpenFile( dvd, title, DVD_READ_INFO_FILE );
> if( dvd_file != NULL ) {
> ssize_t bytes_read;
>
>
> _______________________________________________
> DVDnav-discuss mailing list
> DVDnav-discuss at mplayerhq.hu
> https://lists.mplayerhq.hu/mailman/listinfo/dvdnav-discuss
>
--
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device
More information about the DVDnav-discuss
mailing list