OSDN Git Service

HandBrake 0.2
[handbrake-jp/handbrake-jp-git.git] / HBDVDReader.cpp
1 /* $Id: HBDVDReader.cpp,v 1.7 2003/08/12 20:10:50 titer Exp $ */
2
3 #include "HBCommon.h"
4 #include "HBDVDReader.h"
5 #include "HBManager.h"
6 #include "HBFifo.h"
7
8 #include <Application.h>
9
10 #include <dvdread/ifo_types.h>
11 #include <dvdplay/dvdplay.h>
12 #include <dvdplay/info.h>
13 #include <dvdplay/state.h>
14 #include <dvdplay/nav.h>
15
16 HBDVDReader::HBDVDReader( HBManager * manager,
17                           HBTitleInfo * titleInfo )
18     : HBThread( "dvdreader", B_NORMAL_PRIORITY )
19 {
20     fManager   = manager;
21     fTitleInfo = titleInfo;
22 }
23
24 void HBDVDReader::DoWork()
25 {
26     /* Open the device */
27     dvdplay_ptr vmg;
28     vmg = dvdplay_open( fTitleInfo->fDevice, NULL, NULL );
29     if( !vmg )
30     {
31         Log( "HBDVDReader: dvdplay_open() failed" );
32         fManager->Error();
33         return;
34     }
35     
36     /* Open the title */
37     dvdplay_start( vmg, fTitleInfo->fIndex );
38     
39     /* Read */
40     HBBuffer * dvdBuffer;
41     int        beginPosition = dvdplay_position( vmg );
42     int        endPosition   = dvdplay_title_end( vmg );
43     while( dvdplay_position( vmg ) < endPosition )
44     {
45         dvdBuffer = new HBBuffer( DVD_VIDEO_LB_LEN );
46         dvdBuffer->fPosition = (float) ( dvdplay_position( vmg ) - beginPosition ) /
47                                (float) ( endPosition - beginPosition ) ;
48
49         if( dvdplay_read( vmg, dvdBuffer->fData, 1 ) < 0 )
50         {
51             Log( "HBDVDReader: could not dvdplay_read()" );
52             delete dvdBuffer;
53             fManager->Error();
54             break;
55         }
56         if( !( fTitleInfo->fPSFifo->Push( dvdBuffer ) ) )
57         {
58             break;
59         }
60     }
61     
62     if( dvdplay_position( vmg ) == dvdplay_title_end( vmg ) )
63         fManager->Done();
64     
65     /* Clean up */
66     dvdplay_close( vmg );
67 }