FfmpegDecoder.H

Go to the documentation of this file.
00001 /*!@file Media/FfmpegDecoder.H Low-level class for using ffmpeg to decode movie files */
00002 
00003 // //////////////////////////////////////////////////////////////////// //
00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005   //
00005 // by the University of Southern California (USC) and the iLab at USC.  //
00006 // See http://iLab.usc.edu for information about this project.          //
00007 // //////////////////////////////////////////////////////////////////// //
00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected //
00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency //
00010 // in Visual Environments, and Applications'' by Christof Koch and      //
00011 // Laurent Itti, California Institute of Technology, 2001 (patent       //
00012 // pending; application number 09/912,225 filed July 23, 2001; see      //
00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status).     //
00014 // //////////////////////////////////////////////////////////////////// //
00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit.       //
00016 //                                                                      //
00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can   //
00018 // redistribute it and/or modify it under the terms of the GNU General  //
00019 // Public License as published by the Free Software Foundation; either  //
00020 // version 2 of the License, or (at your option) any later version.     //
00021 //                                                                      //
00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope  //
00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the   //
00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //
00025 // PURPOSE.  See the GNU General Public License for more details.       //
00026 //                                                                      //
00027 // You should have received a copy of the GNU General Public License    //
00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write   //
00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,   //
00030 // Boston, MA 02111-1307 USA.                                           //
00031 // //////////////////////////////////////////////////////////////////// //
00032 //
00033 // Primary maintainer for this file: Rob Peters <rjpeters at usc dot edu>
00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Media/FfmpegDecoder.H $
00035 // $Id: FfmpegDecoder.H 12374 2009-12-22 16:38:48Z rand $
00036 //
00037 
00038 #ifndef MEDIA_FFMPEGDECODER_H_DEFINED
00039 #define MEDIA_FFMPEGDECODER_H_DEFINED
00040 
00041 #ifdef INVT_HAVE_AVCODEC
00042 
00043 #include "Media/MovieDecoder.H" // for byte
00044 
00045 #include <cstdio>
00046 #define attribute_deprecated
00047 extern "C"
00048 {
00049 #ifdef HAVE_FFMPEG_AVCODEC_H
00050   #include <ffmpeg/avcodec.h>
00051 #else
00052 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
00053   #include <libavcodec/avcodec.h>
00054 #endif
00055 #endif
00056 }
00057 #include <vector>
00058 
00059 /// Low-level class for using ffmpeg to decode movie files
00060 class FfmpegDecoder : public MovieDecoder
00061 {
00062 public:
00063   /// Construct an ffmpeg stream from a filename, codec name, etc.
00064   FfmpegDecoder(const char* codecname, const int bufflen,
00065                 const char* fname, const bool preload);
00066 
00067   /// Destructor
00068   virtual ~FfmpegDecoder();
00069 
00070   /// Get the "apparent" frame number
00071   /** This function takes into account whether or not the next frame
00072       will be a push-back frame */
00073   virtual int apparentFrameNumber() const;
00074 
00075   /// Get the specifications of the movie frames
00076   virtual GenericFrameSpec peekFrameSpec();
00077 
00078   /// Get the next raw VideoFrame from the stream
00079   virtual VideoFrame readVideoFrame();
00080 
00081   /// Read an RGB image from the stream
00082   virtual Image<PixRGB<byte> > readRGB();
00083 
00084   /// Read a frame from the stream and discard it
00085   /** If you know you are going to discard the frame (e.g. to skip
00086       ahead to a certain frame number, or to count the frame), then it
00087       is more efficient to call readAndDiscardFrame() than to call
00088       readVideoFrame() or readRGB() but ignore the result. */
00089   virtual bool readAndDiscardFrame();
00090 
00091 private:
00092   FfmpegDecoder(const FfmpegDecoder&); // not implemented
00093   FfmpegDecoder& operator=(const FfmpegDecoder&); // not implemented
00094 
00095   /// Read a raw frame from the stream
00096   /** NOTE: This function used to be public, but now we have
00097       readVideoFrame() to serve that purpose instead (returns a raw
00098       YUV frame, but with additional contextual information). If it
00099       seems that you need to make readRawFrame() public again, that
00100       wouldn't be the end of the world, but first check if you could
00101       achieve what you need with an appropriate extension to the
00102       VideoFrame class. */
00103   const AVFrame* readRawFrame();
00104 
00105   /// Refill our buffer by reading more data from the file
00106   /** Return the number of additional bytes read */
00107   size_t refillBuffer();
00108 
00109   FILE*           itsFile;
00110   AVCodecContext  itsContext;
00111   AVFrame         itsPicture;
00112   int             itsFrameNumber;
00113   std::vector<byte> itsBuf; // our frame read buffer
00114   size_t          itsIdxStart;
00115   size_t          itsIdxEnd;
00116   bool            itsInputEOF; // needed to correctly decode last input frame
00117   bool            itsDimsValid; // if we've read frame #1, then dims are valid
00118   bool            itsNextFramePushback; // whether to re-use the current frame
00119 };
00120 
00121 #endif // HAVE_FFMPEG_AVCODEC_H
00122 
00123 // ######################################################################
00124 /* So things look consistent in everyone's emacs... */
00125 /* Local Variables: */
00126 /* mode: c++ */
00127 /* indent-tabs-mode: nil */
00128 /* End: */
00129 
00130 #endif // MEDIA_FFMPEGDECODER_H_DEFINED
Generated on Sun May 8 08:41:00 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3