summaryrefslogtreecommitdiffstats
path: root/libk9copy/k9cellcopylist.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-17 00:32:19 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-17 00:32:19 +0000
commit0d382a262c0638d0f572fc37193ccc5ed3dc895f (patch)
tree8578dcddfce4191f3f7a142a37769df7add48475 /libk9copy/k9cellcopylist.cpp
downloadk9copy-0d382a262c0638d0f572fc37193ccc5ed3dc895f.tar.gz
k9copy-0d382a262c0638d0f572fc37193ccc5ed3dc895f.zip
Added old abandoned version of k9copy
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/k9copy@1091546 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'libk9copy/k9cellcopylist.cpp')
-rw-r--r--libk9copy/k9cellcopylist.cpp373
1 files changed, 373 insertions, 0 deletions
diff --git a/libk9copy/k9cellcopylist.cpp b/libk9copy/k9cellcopylist.cpp
new file mode 100644
index 0000000..656da5f
--- /dev/null
+++ b/libk9copy/k9cellcopylist.cpp
@@ -0,0 +1,373 @@
+/***************************************************************************
+* Copyright (C) 2005 by Jean-Michel Petit *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with this program; if not, write to the *
+* Free Software Foundation, Inc., *
+* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+***************************************************************************/
+#include "k9cellcopylist.h"
+#include "k9dvdtitle.h"
+#include "k9ifo2.h"
+
+#include <kmessagebox.h>
+
+int k9CellVTSList::compareItems ( QPtrCollection::Item item1, QPtrCollection::Item item2 ) {
+ k9CellCopyVTS * it1,*it2;
+ it1=(k9CellCopyVTS *) item1;
+ it2=(k9CellCopyVTS *)item2;
+ if (it1->getsize() >it2->getsize())
+ return 1;
+ else if (it1->getsize() <it2->getsize())
+ return -1;
+ else {
+ if (it1->getnum()>it2->getnum())
+ return 1;
+ else
+ return -1;
+ }
+}
+
+uint k9CellCopyVTS::getnum() {
+ return num;
+}
+void k9CellCopyVTS::addsize(uint32_t _size) {
+ size+=_size;
+}
+uint64_t k9CellCopyVTS::getsize() {
+ return size;
+}
+
+k9CellCopyList::k9CellCopyList(k9DVDRead * _dvdHandle,k9DVD *_DVD)
+ : QObjectList() {
+ setAutoDelete(true);
+ DVD=_DVD;
+ dvdHandle=_dvdHandle;
+ fill();
+
+
+}
+
+k9CellCopyList::~k9CellCopyList() {}
+
+/*!
+ \fn k9CellCopyList::fill()
+ */
+void k9CellCopyList::fill() {
+// k9Ifo2 kifo(dvdHandle) ,kifoZero(dvdHandle);
+ ifo_handle_t *hifo,*hifoZero;
+ k9Ifo2 *kifo,*kifoZero;
+ kifoZero=dvdHandle->getIfo(0);
+ hifoZero=kifoZero->getIFO();
+
+// kifoZero.openIFO( 0);
+
+ int nrTS= hifoZero->vmgi_mat->vmg_nr_of_title_sets;
+
+ for (int iTS=1 ; iTS<=nrTS;iTS++) {
+ //kifo.openIFO( iTS);
+ kifo=dvdHandle->getIfo(iTS);
+ hifo=kifo->getIFO();
+ c_adt_t *c_adt = hifo->vts_c_adt;
+ uint32_t length = c_adt->last_byte + 1 - C_ADT_SIZE;
+ cell_adr_t *ptr;
+ ptr= c_adt->cell_adr_table;
+ uint32_t imax=length/sizeof(cell_adr_t);
+
+ for(uint32_t i = 0; i <imax; i++) {
+ uchar angleBlock=angleNone;
+ k9Cell *cell=NULL;
+ cell=addCell(iTS,0,i+1,ptr[i].start_sector,ptr[i].last_sector,angleBlock);
+ }
+ //kifo.closeIFO();
+ }
+ //kifoZero.closeIFO();
+ sortVTSList();
+ m_frcinbytes=m_frcoutbytes=m_inbytes=m_outbytes=0;
+}
+
+
+k9Cell *k9CellCopyList::addCell(int _VTS,int _pgc,int _id,uint32_t startSector,uint32_t lastSector,uchar _angleBlock) {
+ bool bInsert=false;
+ bool bFound=false;
+ uint position=0;
+ k9Cell *cell =NULL;
+
+ for (uint i=0;i< count() && !bFound && !bInsert;i++) {
+ cell=(k9Cell*) at(i);
+ if (cell->startSector ==startSector && cell->vts==_VTS) {
+ bFound=true;
+ if (cell->lastSector!=lastSector )
+ qDebug("last sector doesn't match","DVD Backup");
+
+ }
+ if (!bFound && (_VTS <cell->vts || (startSector<cell->startSector && cell->vts ==_VTS ) )) {
+ bInsert=true;
+ position=i;
+ }
+
+ }
+
+ if (!bFound) {
+ cell = new k9Cell();
+ cell->vts=_VTS;
+ cell->startSector=startSector;
+ cell->lastSector=lastSector;
+ cell->pgc=_pgc;
+ cell->id=_id;
+ cell->angleBlock=_angleBlock;
+ cell->selected=checkSelected(cell);
+
+ if (bInsert)
+ insert(position,cell);
+ else
+ append(cell);
+
+ uint32_t isize;
+ isize= cell->selected ? ((lastSector-startSector)*2048):2;
+ setVTS(_VTS,isize);
+ }
+ return(cell);
+}
+void k9CellCopyList::setVTS(uint _numVTS,uint32_t _size) {
+ bool bfound=false;
+ for (uint iVTS=0; iVTS<VTSList.count();iVTS++) {
+ k9CellCopyVTS *VTS=VTSList.at(iVTS);
+ if (VTS->getnum()==_numVTS) {
+ VTS->addsize(_size);
+ bfound=true;
+ }
+ }
+ if (!bfound) {
+ k9CellCopyVTS * VTS= new k9CellCopyVTS(_numVTS);
+ VTS->addsize(_size);
+ VTSList.append(VTS);
+ }
+}
+
+void k9CellCopyList::sortVTSList() {
+ VTSList.sort();
+}
+
+
+void k9CellCopyList::addStreams(k9DVDTitle *_title,k9Cell *_cell) {
+ k9DVDSubtitle *l_sub;
+ k9DVDAudioStream *l_auds;
+ for (int i=0;i<_title->getaudioStreamCount();i++) {
+ l_auds=_title->getaudioStream(i);
+ if (l_auds->getselected()) {
+ QValueList<int>::iterator it;
+ bool found=false;
+ for ( it = _cell->audio.begin(); it != _cell->audio.end(); ++it ) {
+ if (*it == l_auds->getID())
+ found=true;
+ }
+ if (!found)
+ _cell->audio.append(l_auds->getID());
+ }
+ }
+
+ for (int i=0;i<_title->getsubPictureCount();i++) {
+ QString c;
+ l_sub=_title->getsubtitle(i);
+ if (l_sub->getselected()) {
+ QValueList<int>::iterator it;
+ bool found=false;
+ for ( it = _cell->subpicture.begin(); it != _cell->subpicture.end(); ++it ) {
+ if (l_sub->getID().contains(*it))
+ found=true;
+ }
+ if (!found)
+ _cell->subpicture+=l_sub->getID();
+ }
+ }
+}
+
+/*!
+ \fn k9CellCopyList::checkSelected(k9Cell *_cell)
+ */
+bool k9CellCopyList::checkSelected(k9Cell *_cell) {
+ bool selected=false;
+ for (int i=0; i< DVD->gettitleCount();i++) {
+ k9DVDTitle *title=DVD->gettitle(i);
+//FACTOR if ( title->getVTS()==_cell->vts && title ->isSelected()) {
+ if ( title->getVTS()==_cell->vts) { // { && title ->isSelected()) {
+ for (int j=0; j <title->getchapterCount();j++) {
+ k9DVDChapter * chapter= title->getChapter(j);
+ if (_cell->startSector >= chapter->getstartSector() && _cell->startSector<=chapter->getendSector()) {
+ //add a reference to the title in the titles list from the cell
+ _cell->addTitle( title); //FACTOR
+// if (title->isSelected()) {
+ if (chapter->getSelected()) {
+ addStreams (title,_cell);
+ selected=true;
+ }
+ }
+ }
+ }
+ }
+ return selected;
+}
+
+double k9CellCopyList::gettotalSize() {
+ double totalSize=0;
+ for (uint iCell=0;iCell<count();iCell++) {
+ k9Cell *cell=(k9Cell*)at(iCell);
+// if (!cell->copied) {
+ if (cell->selected) {
+ if (cell->angleBlock==angleNone)
+ totalSize += cell->lastSector-cell->startSector;
+ else if (cell->angleBlock==angleStart) {
+ uint32_t start=0,end=0;
+ start=cell->startSector;
+ // loop inside the angle block to find the last sector.
+ while (((k9Cell*)at(iCell))->angleBlock !=angleNone) {
+ end=((k9Cell*)at(iCell))->lastSector;
+ iCell++;
+ }
+ iCell--;
+ totalSize += end-start;
+ }
+ } else
+ totalSize += 1;
+ // }
+ }
+ return (totalSize*2048);
+ ;
+
+}
+
+//gives the final size of cells with a forced shrink factor
+double k9CellCopyList::getforcedSize(bool _withFactor) {
+ double totalSize=0;
+ for (uint iCell=0;iCell<count();iCell++) {
+ k9Cell *cell=(k9Cell*)at(iCell);
+ double factor = _withFactor ? cell->getFactor():1;
+ double size=0;
+// if (!cell->copied) {
+ if (cell->selected && cell->getforceFactor() ) {
+ if (cell->angleBlock==angleNone)
+ size = cell->lastSector-cell->startSector;
+ else if (cell->angleBlock==angleStart) {
+ uint32_t start=0,end=0;
+ start=cell->startSector;
+ // loop inside the angle block to find the last sector.
+ while (((k9Cell*)at(iCell))->angleBlock !=angleNone) {
+ end=((k9Cell*)at(iCell))->lastSector;
+ iCell++;
+ }
+ iCell--;
+ size += end-start;
+ }
+ totalSize += (size/factor);
+ }
+ // }
+ }
+ return (totalSize*2048);
+
+}
+
+double k9CellCopyList::getMinFactor(bool _withMenus) {
+
+ double fforced=getforcedSize( false);
+ double MaxSize=k9DVDSize::getMaxSize();
+ MaxSize*=1024*1024;
+ double menuSize=0;
+
+ if (_withMenus)
+ menuSize=DVD->getmenuSize();
+
+ menuSize= menuSize*2048;
+ //totalSize=part of dvd with auto shrink factor/2.5
+ //double totalSize=gettotalSize()+menuSize - (fforced-m_frcinbytes) -m_inbytes;
+ double totalSize=gettotalSize()+menuSize - (fforced) -m_inbytes;
+ totalSize/=2.50;
+
+qDebug(QString("totalSize(%1)=gettotalSize()(%2)+menuSize(%3) -(fforced(%4))-m_inbytes(%6)").arg(totalSize).arg(gettotalSize()).arg(menuSize).arg(fforced).arg(m_frcinbytes).arg(m_inbytes));
+
+ double minFactor=(fforced-m_frcinbytes) /(MaxSize- (totalSize +m_outbytes) - m_frcoutbytes) ;
+ qDebug(QString("minfactor(%1)=(fforced(%2) -m_frinbytes(%3))/(MacSize(%4)-totalSize(%5)-m_outbytes(%6) - m_frcoutbytes(%7))").arg(minFactor).arg(fforced).arg(m_frcinbytes).arg(MaxSize).arg(totalSize).arg(m_outbytes).arg(m_frcoutbytes));
+
+ if (minFactor<1)
+ minFactor=1;
+ return minFactor;
+}
+
+
+double k9CellCopyList::getfactor(bool _withMenus,bool _streams) {
+
+ double totalSize=gettotalSize();
+
+ if (_streams) {
+ double unsel=0;
+ for (int i=0;i<DVD->gettitleCount();i++) {
+ k9DVDTitle *track=DVD->gettitle(i);
+ for (int j=0; j<track->getaudioStreamCount();j++) {
+ k9DVDAudioStream *audio=track->getaudioStream(j);
+ if (! audio->getselected())
+ unsel+=audio->getsize_mb();
+ }
+ for (int j=0; j<track->getsubPictureCount();j++) {
+ k9DVDSubtitle *sub=track->getsubtitle(j);
+ if (! sub->getselected())
+ unsel+=sub->getsize_mb();
+ }
+ }
+ unsel*=1024*1024;
+ totalSize-=unsel;
+ }
+
+ double menuSize=0;
+
+ if (_withMenus)
+ menuSize=DVD->getmenuSize();
+
+ menuSize= menuSize*2048;
+
+ double dvdSize=k9DVDSize::getMaxSize() ;
+ dvdSize*=1024*1024;
+
+ double factor;
+
+ double fforced=getforcedSize(false)-m_frcinbytes;
+ double fforcedsh=getforcedSize(true)-m_frcoutbytes;
+ double dvdSize2=dvdSize-m_outbytes -fforcedsh;
+ // dvdSize2 -=menuSize;
+
+ if (dvdSize2 <0) {
+ factor=2.5;
+ //qDebug(QString("dvdSize (%1)- _outbytes(%2) - fforcedsh(%3)=%4").arg(dvdSize).arg(m_outbytes).arg(fforcedsh).arg(dvdSize2));
+ }
+ else {
+ factor=(totalSize +menuSize - fforced -m_inbytes)/ dvdSize2 ;
+
+ factor = (int)(factor*100);
+ factor /=100;
+ factor+=0.01;
+ // }
+
+ uint64_t o=m_outbytes;
+ uint64_t i=m_inbytes;
+ //if (o==0)
+ // o=1;
+ //qDebug(QString("factor : %1 realise : %2").arg(factor).arg((double)i/(double)o));
+
+ if (factor<=1)
+ factor=1;
+ else if (factor>3)
+ factor=3;
+ }
+
+ return (factor);
+}