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