Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

mitk::MovieGeneratorWin32 Class Reference

#include <mitkMovieGeneratorWin32.h>

Inheritance diagram for mitk::MovieGeneratorWin32:
Inheritance graph
[legend]
Collaboration diagram for mitk::MovieGeneratorWin32:
Collaboration graph
[legend]

List of all members.

Public Types

typedef MovieGeneratorWin32 Self
typedef MovieGenerator Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
virtual void SetFileName (const char *fileName)
 filename under which movie is saved

Static Public Member Functions

static Pointer New ()

Protected Member Functions

 MovieGeneratorWin32 ()
void InitBitmapHeader ()
 reads out size of current OpenGL context and stores it
virtual bool InitGenerator ()
 called directly before the first frame is added
virtual bool AddFrame (void *data)
 used to add a frame
virtual bool TerminateGenerator ()
 called after the last frame is added

Protected Attributes

_bstr_t m_sFile
 name of output file
BITMAPINFOHEADER m_bih
 structure contains information for a single stream
_bstr_t m_sError
 last error string

Detailed Description

Definition at line 36 of file mitkMovieGeneratorWin32.h.


Member Typedef Documentation

typedef itk::SmartPointer<const Self> mitk::MovieGeneratorWin32::ConstPointer

Reimplemented from mitk::MovieGenerator.

Definition at line 41 of file mitkMovieGeneratorWin32.h.

typedef itk::SmartPointer<Self> mitk::MovieGeneratorWin32::Pointer

Reimplemented from mitk::MovieGenerator.

Definition at line 41 of file mitkMovieGeneratorWin32.h.

Reimplemented from mitk::MovieGenerator.

Definition at line 41 of file mitkMovieGeneratorWin32.h.

Reimplemented from mitk::MovieGenerator.

Definition at line 41 of file mitkMovieGeneratorWin32.h.


Constructor & Destructor Documentation

mitk::MovieGeneratorWin32::MovieGeneratorWin32 (  ) [protected]

Definition at line 22 of file mitkMovieGeneratorWin32.cpp.

{
}

Member Function Documentation

bool mitk::MovieGeneratorWin32::AddFrame ( void *  data ) [protected, virtual]

used to add a frame

Implements mitk::MovieGenerator.

Definition at line 221 of file mitkMovieGeneratorWin32.cpp.

{
  HRESULT hr = AVIStreamWrite(m_pStreamCompressed,  // stream pointer
    m_lFrame,              // time of this frame
    1,                    // number to write
    (BYTE*)data,          // image buffer
    m_bih.biSizeImage,    // size of this frame
    AVIIF_KEYFRAME,        // flags....
    NULL,
    NULL                );
  // updating frame counter
  m_lFrame++;

  if (hr==AVIERR_OK) return true;
  else return false;
}
virtual const char* mitk::MovieGeneratorWin32::GetClassName (  ) const [virtual]

Reimplemented from mitk::MovieGenerator.

void mitk::MovieGeneratorWin32::InitBitmapHeader (  ) [protected]

reads out size of current OpenGL context and stores it

Definition at line 34 of file mitkMovieGeneratorWin32.cpp.

{
  m_width  = m_renderer->GetRenderWindow()->GetSize()[0];  // changed from glGetIntegerv( GL_VIEWPORT, viewport );
  m_height = m_renderer->GetRenderWindow()->GetSize()[1]; // due to sometimes strange dimensions
  
  m_width  -= 10;  //remove colored boarders around renderwindows 
  m_height -= 10;
   
  m_width  -= m_width % 4; // some video codecs have prerequisites to the image dimensions
  m_height -= m_height % 4;

  BITMAPINFOHEADER bih;
  bih.biSize = sizeof( BITMAPINFOHEADER );
  bih.biWidth = m_width;
  bih.biHeight = m_height;
  bih.biPlanes = 1;
  int imgSize = 3 /* BRG*/ * bih.biWidth* bih.biHeight;
  bih.biBitCount = 24;
  bih.biCompression = BI_RGB;
  bih.biSizeImage = imgSize;
  bih.biClrUsed = 0;
  bih.biClrImportant = 0;

  //ASSERT(bih.biWidth%4==0);
  //ASSERT(bih.biHeight%4==0);

  // copying bitmap info structure.
  memcpy( &m_bih, &bih, sizeof( BITMAPINFOHEADER ) );
}
bool mitk::MovieGeneratorWin32::InitGenerator (  ) [protected, virtual]

called directly before the first frame is added

Implements mitk::MovieGenerator.

Definition at line 65 of file mitkMovieGeneratorWin32.cpp.

{
  InitBitmapHeader();

  AVISTREAMINFO strHdr; // information for a single stream 
  AVICOMPRESSOPTIONS opts;
  AVICOMPRESSOPTIONS FAR * aopts[1] = {&opts};

  TCHAR szBuffer[1024];
  HRESULT hr;

  m_sError=_T("Ok");

  // Step 0 : Let's make sure we are running on 1.1 
  DWORD wVer = HIWORD(VideoForWindowsVersion());
  if (wVer < 0x010a) {
    // oops, we are too old, blow out of here 
    m_sError=_T("Version of Video for Windows too old. Come on, join the 21th century!");
    return false;
  }

  // Step 1 : initialize AVI engine
  AVIFileInit();

  // Step 2 : Open the movie file for writing....
  hr = AVIFileOpen(&m_pAVIFile,      // Address to contain the new file interface pointer
    (LPCTSTR)m_sFile,        // Null-terminated string containing the name of the file to open
    OF_WRITE | OF_CREATE,      // Access mode to use when opening the file. 
    NULL);            // use handler determined from file extension.
  // Name your file .avi -> very important

  if (hr != AVIERR_OK) {
    _tprintf(szBuffer,_T("AVI Engine failed to initialize. Check filename %s."),m_sFile);
    m_sError=szBuffer;
    // Check it succeded.
    switch(hr) {
    case AVIERR_BADFORMAT: 
      m_sError+=_T("The file couldn't be read, indicating a corrupt file or an unrecognized format.");
      break;
    case AVIERR_MEMORY:    
      m_sError+=_T("The file could not be opened because of insufficient memory."); 
      break;
    case AVIERR_FILEREAD:
      m_sError+=_T("A disk error occurred while reading the file."); 
      break;
    case AVIERR_FILEOPEN:    
      m_sError+=_T("A disk error occurred while opening the file.");
      break;
    case REGDB_E_CLASSNOTREG:    
      m_sError+=_T("According to the registry, the type of file specified in AVIFileOpen does not have a handler to process it");
      break;
    }

    return false;
  }

  // Fill in the header for the video stream....
  memset(&strHdr, 0, sizeof(strHdr));
  strHdr.fccType                = streamtypeVIDEO;  // video stream type
  strHdr.fccHandler             = 0;
  strHdr.dwScale                = 1;          // should be one for video
  strHdr.dwRate                 = static_cast<DWORD>(m_FrameRate);        // fps
  strHdr.dwSuggestedBufferSize  = m_bih.biSizeImage;  // Recommended buffer size, in bytes, for the stream.
  SetRect(&strHdr.rcFrame, 0, 0,        // rectangle for stream
    (int) m_bih.biWidth,
    (int) m_bih.biHeight);

  // Step 3 : Create the stream;
  hr = AVIFileCreateStream(m_pAVIFile,        // file pointer
    &m_pStream,        // returned stream pointer
    &strHdr);      // stream header

  // Check it succeded.
  if (hr != AVIERR_OK) {
    m_sError=_T("AVI Stream creation failed. Check Bitmap info.");
    if (hr==AVIERR_READONLY) {
      m_sError+=_T(" Read only file.");
    }
    return false;
  }

  // Step 4: Get codec and infos about codec
  memset(&opts, 0, sizeof(opts));
  
  // predefine MS-CRAM as standard codec
  opts.fccType = streamtypeVIDEO;
  //creates a video with minor quality! Use different codec (must be installed on local machine) to generate movies with higher quality
  opts.fccHandler = mmioFOURCC('M','S','V','C'); 
  opts.dwQuality = 90000; // means 90% quality; dwQuality goes from [0...10000]
  
  
  
  // Poping codec dialog
  // GUI Codec selection does not work in a vs 2005 compiled mitk, since we do not pass a hwnd as first parameter
  // of AVISaveOptions
  #if ! (_MSC_VER >= 1400)

  if (!AVISaveOptions(NULL, 0, 1, &m_pStream, (LPAVICOMPRESSOPTIONS FAR *) &aopts))  {
    AVISaveOptionsFree(1,(LPAVICOMPRESSOPTIONS FAR *) &aopts);
    //return false;
  }

  #endif

  // Step 5:  Create a compressed stream using codec options.
  hr = AVIMakeCompressedStream(&m_pStreamCompressed, 
    m_pStream, 
    &opts, 
    NULL);

  if (hr != AVIERR_OK)
  {
    m_sError=_T("AVI Compressed Stream creation failed.");

    switch(hr)
    {
    case AVIERR_NOCOMPRESSOR:
      m_sError+=_T(" A suitable compressor cannot be found.");
      break;
    case AVIERR_MEMORY:
      m_sError+=_T(" There is not enough memory to complete the operation.");
      break; 
    case AVIERR_UNSUPPORTED:
      m_sError+=_T("Compression is not supported for this type of data. This error might be returned if you try to compress data that is not audio or video.");
      break;
    }

    return false;
  }

  // releasing memory allocated by AVISaveOptionFree
  hr=AVISaveOptionsFree(1,(LPAVICOMPRESSOPTIONS FAR *) &aopts);
  if (hr!=AVIERR_OK) {
    m_sError=_T("Error releasing memory");
    return false;
  }

  // Step 6 : sets the format of a stream at the specified position
  hr = AVIStreamSetFormat(m_pStreamCompressed, 
    0,      // position
    &m_bih,      // stream format
    m_bih.biSize +   // format size
    m_bih.biClrUsed * sizeof(RGBQUAD));

  if (hr != AVIERR_OK) {
    m_sError=_T("AVI Compressed Stream format setting failed.");
    return false;
  }

  // Step 6 : Initialize step counter
  m_lFrame=0;

  return true;
}
static Pointer mitk::MovieGeneratorWin32::New (  ) [static]

Reimplemented from mitk::MovieGenerator.

Referenced by mitk::MovieGenerator::New().

void mitk::MovieGeneratorWin32::SetFileName ( const char *  fileName ) [virtual]

filename under which movie is saved

Reimplemented from mitk::MovieGenerator.

Definition at line 27 of file mitkMovieGeneratorWin32.cpp.

{
  m_sFile = _T( fileName );
  if( _tcsstr( (char*)m_sFile, _T("avi") ) == NULL ) m_sFile += _T( ".avi" );
}
bool mitk::MovieGeneratorWin32::TerminateGenerator (  ) [protected, virtual]

called after the last frame is added

Implements mitk::MovieGenerator.

Definition at line 239 of file mitkMovieGeneratorWin32.cpp.

{
  if (m_pStream) {
    AVIStreamRelease(m_pStream);
    m_pStream=NULL;
  }
  if (m_pStreamCompressed) {
    AVIStreamRelease(m_pStreamCompressed);
    m_pStreamCompressed=NULL;
  }
  if (m_pAVIFile)  {
    AVIFileRelease(m_pAVIFile);
    m_pAVIFile=NULL;
  }
  // Close engine
  AVIFileExit();
  return true;
}

Member Data Documentation

BITMAPINFOHEADER mitk::MovieGeneratorWin32::m_bih [protected]

structure contains information for a single stream

Definition at line 67 of file mitkMovieGeneratorWin32.h.

last error string

Definition at line 70 of file mitkMovieGeneratorWin32.h.

name of output file

Definition at line 64 of file mitkMovieGeneratorWin32.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines