Difference between revisions of "Anri-chan/Source/pgccount.cpp"
From SDA Knowledge Base
Ballofsnow (Talk | contribs) (pgccount v0.1) |
Ballofsnow (Talk | contribs) (0.2 - Fixed creation of blank pgclist.txt when no parameters given.) |
||
Line 5: | Line 5: | ||
author: ballofsnow | author: ballofsnow | ||
− | date: | + | date: 10 November 2007 |
license: none (public domain) | license: none (public domain) | ||
target: win32 (MINGW), recommend using the free IDE from bloodshed.net | target: win32 (MINGW), recommend using the free IDE from bloodshed.net | ||
− | version: beta 0. | + | version: beta 0.2 |
*/ | */ | ||
Line 37: | Line 37: | ||
cout << "PGC count v0.1, ballofsnow" << endl; | cout << "PGC count v0.1, ballofsnow" << endl; | ||
− | |||
if (argc==1) { | if (argc==1) { | ||
usage(argv[0]); | usage(argv[0]); | ||
return -1; | return -1; | ||
} | } | ||
− | + | ||
for (int p=1;p<argc;p++) { | for (int p=1;p<argc;p++) { | ||
/* LOAD AND VALIDATE THE IFO */ | /* LOAD AND VALIDATE THE IFO */ | ||
Line 60: | Line 59: | ||
} | } | ||
/* FINISHED VALIDATING */ | /* FINISHED VALIDATING */ | ||
− | + | ||
+ | fstream pgclist("pgclist.txt",ios::out); | ||
+ | |||
goodpgcs=1; | goodpgcs=1; | ||
pgctotal=buffer[pgctable]*0x100+buffer[pgctable+1]; | pgctotal=buffer[pgctable]*0x100+buffer[pgctable+1]; | ||
Line 87: | Line 88: | ||
} | } | ||
free(buffer); // ifo buffer | free(buffer); // ifo buffer | ||
− | fclose(ifo); | + | fclose(ifo); |
− | + | pgclist.close(); | |
− | + | } | |
cout << "pgclist.txt created successfully." << endl; | cout << "pgclist.txt created successfully." << endl; | ||
return 0; | return 0; | ||
Line 95: | Line 96: | ||
void usage(char *argv0) { | void usage(char *argv0) { | ||
− | cout << "Usage: " << argv0 << "<VTS IFO file> [VTS IFO file]" << endl; | + | cout << "Usage: " << argv0 << " <VTS IFO file> [VTS IFO file]" << endl; |
cout << "Creates number list of unique program chains in pgclist.txt." << endl; | cout << "Creates number list of unique program chains in pgclist.txt." << endl; | ||
} | } | ||
</nowiki></pre> | </nowiki></pre> |
Revision as of 14:07, 10 November 2007
/* Creates number list of unique program chains in pgclist.txt. author: ballofsnow date: 10 November 2007 license: none (public domain) target: win32 (MINGW), recommend using the free IDE from bloodshed.net version: beta 0.2 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fstream> #include <iostream> using namespace std; void usage(char *argv0); unsigned char checkifo[12]= { 0x44, 0x56, 0x44, 0x56, 0x49, 0x44, 0x45, 0x4F, 0x2D, 0x56, 0x54, 0x53 }; /* DVDVIDEO-VTS */ unsigned char buffer[1024*1024]; int main (int argc, char **argv) { FILE *ifo; char *ifoname=NULL; int pgctable=0x1000; int pgctotal; unsigned long sectors[1024]; // obscene, I know. unsigned long pgcstart; unsigned long cellsector; int goodpgcs; int cellstart; int flag; int curpgc=0; cout << "PGC count v0.1, ballofsnow" << endl; if (argc==1) { usage(argv[0]); return -1; } for (int p=1;p<argc;p++) { /* LOAD AND VALIDATE THE IFO */ ifoname=argv[p]; //cout << argv[p] << endl; if ((ifo=fopen(ifoname,"rb"))==NULL) { cout << "Failed to open IFO file " << ifoname << endl; return -1; } fread(buffer,1,1024*1024,ifo); if (memcmp(checkifo,buffer,12) != 0) { cout << "This isn't an IFO file." << endl; free(buffer); fclose(ifo); usage(argv[0]); return -1; } /* FINISHED VALIDATING */ fstream pgclist("pgclist.txt",ios::out); goodpgcs=1; pgctotal=buffer[pgctable]*0x100+buffer[pgctable+1]; for (int i=1; i<=pgctotal; i++) { /* Get PGC start byte */ pgcstart=buffer[pgctable+i*8+4]*0x1000000+buffer[pgctable+i*8+5]*0x10000+buffer[pgctable+i*8+6]*0x100+buffer[pgctable+i*8+7]; cellstart=buffer[pgctable+pgcstart+0xE8]*0x100+buffer[pgctable+pgcstart+0xE9]+8; cellsector=buffer[pgctable+pgcstart+cellstart+0]*0x1000000+buffer[pgctable+pgcstart+cellstart+1]*0x10000+buffer[pgctable+pgcstart+cellstart+2]*0x100+buffer[pgctable+pgcstart+cellstart+3]; //cout << pgcstart << endl; //cout << cellstart << endl; //cout << cellsector << endl << endl; curpgc++; flag=0; for (int a=0; a<goodpgcs-1; a++) { if (cellsector==sectors[a]) { flag=1; break; } } if (flag==0) { sectors[goodpgcs-1]=cellsector; goodpgcs++; //cout << "curpgc: " << curpgc << endl; pgclist << curpgc << "," << argv[p] << endl; } } free(buffer); // ifo buffer fclose(ifo); pgclist.close(); } cout << "pgclist.txt created successfully." << endl; return 0; } void usage(char *argv0) { cout << "Usage: " << argv0 << " <VTS IFO file> [VTS IFO file]" << endl; cout << "Creates number list of unique program chains in pgclist.txt." << endl; }