You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/mpeglib/lib/input/cdromToc.cpp

235 lines
4.2 KiB

/*
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;
}