diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | e2de64d6f1beb9e492daf5b886e19933c1fa41dd (patch) | |
tree | 9047cf9e6b5c43878d5bf82660adae77ceee097a /mpeglib/lib/input/cdromToc.cpp | |
download | tdemultimedia-e2de64d6f1beb9e492daf5b886e19933c1fa41dd.tar.gz tdemultimedia-e2de64d6f1beb9e492daf5b886e19933c1fa41dd.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdemultimedia@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'mpeglib/lib/input/cdromToc.cpp')
-rw-r--r-- | mpeglib/lib/input/cdromToc.cpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/mpeglib/lib/input/cdromToc.cpp b/mpeglib/lib/input/cdromToc.cpp new file mode 100644 index 00000000..919ecdc8 --- /dev/null +++ b/mpeglib/lib/input/cdromToc.cpp @@ -0,0 +1,234 @@ +/* + reads toc from cdrom (system dependent) + Copyright (C) 1999 Martin Vogt + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as published by + the Free Software Foundation. + + For more information look at the file COPYRIGHT in this package + + */ + + + +#include "cdromToc.h" + +#include <iostream> + +using namespace std; + +CDRomToc::CDRomToc() { + maxEntries=0; +} + + +CDRomToc::~CDRomToc() { +} + + +void CDRomToc::insertTocEntry(int minute,int second,int frame) { + int i; + int j; + if (isElement(minute,second,frame)) { + return; + } + + i=getNextTocEntryPos(minute,second,frame); + + // now shift from i to end + if (maxEntries == 100) { + cerr << "maximum of toc entries reached"<<endl; + exit(0); + } + for (j=maxEntries;j>i;j--) { + tocEntries[j].minute=tocEntries[j-1].minute; + tocEntries[j].second=tocEntries[j-1].second; + tocEntries[j].frame=tocEntries[j-1].frame; + } + maxEntries++; + + tocEntries[i].minute=minute; + tocEntries[i].second=second; + tocEntries[i].frame=frame; + calculateRange(); +} + + +int CDRomToc::getNextTocEntryPos(int minute,int second,int frame) { + int i; + if (maxEntries == 0) { + return 0; + } + + for (i=0;i<maxEntries;i++) { + if (tocEntries[i].minute <= minute) { + continue; + } else { + break; + } + if (tocEntries[i].second <= second) { + continue; + } else { + break; + } + if (tocEntries[i].frame <= frame) { + continue; + } + break; + } + return i; +} + + + +int CDRomToc::isElement(int minute,int second,int frame) { + int i; + + for (i=0;i<maxEntries;i++) { + if (tocEntries[i].minute == minute) { + if (tocEntries[i].second == second) { + if (tocEntries[i].frame == frame) { + return true; + } + } + } + } + return false; +} + + + + + + +int CDRomToc::getTocEntries() { + return maxEntries; +} + + +TocEntry* CDRomToc::getTocEntry(int entry) { + return &(tocEntries[entry]); +} + + +void CDRomToc::print() { + int i; + cerr << "******* printing TOC [START]"<<endl; + for(i=0;i<maxEntries;i++) { + cerr << "i:"<<i + <<" M:"<<tocEntries[i].minute + <<" S:"<<tocEntries[i].second + <<" F:"<<tocEntries[i].frame<<endl; + } + cerr << "******* printing TOC [END}"<<endl; +} + + +int CDRomToc::isInRange(int minute,int second,int) { + long val=minute*60+second; + if (val < startByte) { + return false; + } + if (val > endByte) { + return false; + } + return true; +} + +int CDRomToc::calculateRange() { + + + if (maxEntries < 2) { + cout << "no two elemts in toc"<<endl; + return false; + } + startByte=tocEntries[0].minute*60*+tocEntries[0].second; + + // do a safty end because of the kernel bug + int minute=tocEntries[maxEntries-1].minute; + int second=tocEntries[maxEntries-1].second-20; + if (second < 0) { + minute--; + second=60+second; + } + if (minute < 0) { + endByte=0; + return true; + } + + endByte=minute*60+second; + + return true; + +} + + +int CDRomToc::getEndSecond() { + return endByte; +} + + + + +int CDRomToc::open(const char* openfile) { + int i; + int pos=0; + maxEntries=0; + const char* filename=strchr(openfile,'/'); + FILE* file =fopen(filename, "rb"); + if (file == NULL) { + perror("open"); + return false; + } + cout << "reading toc on:"<<filename<<" openfile:"<<openfile<<endl; + + int startToc=0; + int endToc=0; + + if (getStartEnd(file,startToc,endToc) == false) { + cout << "getStartEnd in CDRomToc failed"<<endl; + fclose(file); + return false; + } + cout << "startToc:"<<startToc<<" endToc:"<<endToc<<endl; + cout << "reading toc -2"<<endl; + /* read individual tracks */ + int min; + int sec; + int frame; + + for (i=startToc; i<=endToc; i++) { + int min; + int sec; + int frame; + + if (readToc(file,i,min,sec,frame) == false) { + cout << "error in CDRomToc::readToc"<<endl; + fclose(file); + return false; + } + cout << "min:"<<min<<endl; + cout << "sec:"<<sec<<endl; + cout << "frame:"<<frame<<endl; + + insertTocEntry(min,sec,frame); + pos++; + } + + + /* read the lead-out track */ + if (readLeadOut(file,min,sec,frame) == false) { + cout << "error in CDRomToc::reatLeadOut"<<endl; + return false; + } + pos++; + insertTocEntry(min,sec,frame); + + maxEntries=pos; + + fclose(file); + + return true; +} + |