1 /* $Id: Mpeg2Decoder.cpp,v 1.14 2003/09/30 14:38:15 titer Exp $
3 This file is part of the HandBrake source code.
4 Homepage: <http://beos.titer.org/handbrake/>.
5 It may be used under the terms of the GNU General Public License. */
7 #include "Mpeg2Decoder.h"
12 #include <mpeg2dec/mpeg2.h>
14 #include <ffmpeg/avcodec.h>
16 HBMpeg2Decoder::HBMpeg2Decoder( HBManager * manager, HBTitle * title )
17 : HBThread( "mpeg2decoder" )
23 void HBMpeg2Decoder::DoWork()
25 if( !( fMpeg2Buffer = Pop( fTitle->fMpeg2Fifo ) ) )
30 fPass = fMpeg2Buffer->fPass;
40 if( fMpeg2Buffer->fPass != fPass )
43 fPass = fMpeg2Buffer->fPass;
49 while( ( fMpeg2Buffer = Pop( fTitle->fMpeg2Fifo ) ) );
52 void HBMpeg2Decoder::Init()
57 fHandle = mpeg2_init();
60 void HBMpeg2Decoder::Close()
63 mpeg2_close( fHandle );
66 void HBMpeg2Decoder::DecodeBuffer()
68 const mpeg2_info_t * info = mpeg2_info( fHandle );
71 mpeg2_buffer( fHandle, fMpeg2Buffer->fData,
72 fMpeg2Buffer->fData + fMpeg2Buffer->fSize );
77 state = mpeg2_parse( fHandle );
79 if( state == STATE_BUFFER )
83 else if( ( state == STATE_SLICE || state == STATE_END ) &&
86 HBBuffer * rawBuffer = new HBBuffer( 3 * fTitle->fInWidth *
87 fTitle->fInHeight / 2 );
89 /* TODO : make libmpeg2 write directly in our buffer */
90 memcpy( rawBuffer->fData,
91 info->display_fbuf->buf[0],
92 fTitle->fInWidth * fTitle->fInHeight );
93 memcpy( rawBuffer->fData + fTitle->fInWidth *
95 info->display_fbuf->buf[1],
96 fTitle->fInWidth * fTitle->fInHeight / 4 );
97 memcpy( rawBuffer->fData + fTitle->fInWidth *
98 fTitle->fInHeight + fTitle->fInWidth *
99 fTitle->fInHeight / 4,
100 info->display_fbuf->buf[2],
101 fTitle->fInWidth * fTitle->fInHeight / 4 );
103 rawBuffer->fPosition = fMpeg2Buffer->fPosition;
104 rawBuffer->fPass = fPass;
106 /* NTSC pulldown kludge */
107 if( info->display_picture->nb_fields == 3 )
112 new HBBuffer( rawBuffer->fSize );
113 buffer->fPosition = rawBuffer->fPosition;
114 buffer->fPass = rawBuffer->fPass;
115 memcpy( buffer->fData, rawBuffer->fData,
117 Push( fTitle->fRawFifo, buffer );
119 fLateField = !fLateField;
122 /* Send it to the encoder */
123 if( !( Push( fTitle->fRawFifo, rawBuffer ) ) )
128 else if( state == STATE_INVALID )
130 /* Shouldn't happen on a DVD */
131 Log( "HBMpeg2Decoder : STATE_INVALID" );