MxPEGParser.h

00001 //           ///          //                                  C++ Cross Platform
00002 //          /////        ////
00003 //         /// XXX     XXX ///            ///////////   /////////     ///   ///
00004 //        ///    XXX XXX    ///         ///             ///    ///   ///  ///
00005 //       ///       XXX       ///         /////////     ///      //  //////
00006 //      ///      XXX XXX      ///               ///   ///    ///   ///  ///
00007 //     ////    XXX     XXX    ////    ////////////  //////////    ///   ///
00008 //    ////                     ////
00009 //   ////  M  O  B  O  T  I  X  ////////////////////////////////////////////////
00010 //  //// Security Vision Systems //////////////////////////////////////////////
00011 //
00012 //  $Author: khe_admin $
00013 //  $LastChangedBy: khe_admin $
00014 //  $LastChangedDate: 2007-06-29 15:34:53 +0200 (Fri, 29 Jun 2007) $
00015 //  $HeadURL: http://svn.mobotix.net/svn/mxsdk/src/MxPEGCoreComponent/trunk/include/MxPEGParser.h $
00016 //
00018      //
00019      //  MOBOTIX MxPEG SDK
00020      //
00021      //  This file belongs to the C++ library released as part of the MxPEG SDK.
00022      //
00023      //  This software is licensed under the BSD licence,
00024      //  http://www.opensource.org/licenses/bsd-license.php
00025      //
00026      //  Copyright (c) 2005 - 2007, MOBOTIX AG
00027      //  All rights reserved.
00028      //
00029      //  Redistribution and use in source and binary forms, with or without
00030      //  modification, are permitted provided that the following conditions are
00031      //  met:
00032      //
00033      //  - Redistributions of source code must retain the above copyright
00034      //    notice, this list of conditions and the following disclaimer.
00035      //
00036      //  - Redistributions in binary form must reproduce the above copyright
00037      //    notice, this list of conditions and the following disclaimer in the
00038      //    documentation and/or other materials provided with the distribution.
00039      //
00040      //  - Neither the name of MOBOTIX AG nor the names of its contributors may
00041      //    be used to endorse or promote products derived from this software
00042      //    without specific prior written permission.
00043      //
00044      //  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00045      //  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00046      //  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00047      //  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00048      //  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00049      //  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00050      //  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00051      //  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00052      //  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00053      //  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00054      //  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00055      //
00057 
00058 
00059 
00060 #ifndef __MX_MXPEGPARSER_H__
00061 #define __MX_MXPEGPARSER_H__
00062 
00063 
00064 
00065 #define MX_MXPEGPARSER_ID "MxPEGParser"
00066 
00067 
00068 
00069 #include <interfaces/IComponent.h>
00070 #include <interfaces/IComponentInvoker.h>
00071 #include <interfaces/IMxPEGParser.h>
00072 #include <interfaces/IErrorState.h>
00073 
00074 #include <Framework/Framework.h>
00075 
00076 #include <mxm/core/mxmUndecodedMxPEGFrameDescriptor.h>
00077 #include <mxm/core/mxmLocalEndian.h>
00078 #include <mxm/core/mxmObject.h>
00079 #include <mxm/core/mxmString.h>
00080 #include <mxm/core/mxmStringList.h>
00081 
00082 
00083 
00084 namespace mx {
00085    
00087 
00094    class MxPEGParser : public mxmObject,
00095                        public virtual IComponent,
00096                        public virtual IMxPEGParser {
00097       
00101     private:
00102       static mxm::smart<mxmStringList> _enumerateInterfaces() {
00103          return(new mxmStringList((mxmString(MX_MXPEGPARSER_ID),
00104                                    MX_ICOMPONENT_ID,
00105                                    MX_IMXPEGPARSER_ID,
00106                                    MX_IPROCESSESSTREAM_ID,
00107                                    MX_ISENDSUNDECODEDMXPEGFRAMES_ID,
00108                                    MX_IERRORSTATE_ID)));
00109       }
00110       static mxm::smart<mxmStringList> _enumerateCapabilities(
00111                                           const mxmString &interface) {
00112          if(interface == mx::Framework::IdHintKey)
00113           return(new mxmStringList(MX_MXPEGPARSER_ID));
00114          else
00115           return(new mxmStringList());
00116       }
00117     private:
00118       class Invoker : public mxmObject, public virtual IComponentInvoker {
00119        public:
00120          mxm::smart<mxmStringList> enumerateInterfaces() {
00121             return(_enumerateInterfaces());
00122          }
00123          mxm::smart<mxmStringList> enumerateCapabilities(
00124                                      const mxmString &interface) {
00125             return(_enumerateCapabilities(interface));
00126          }
00127          IComponent *newComponent() {
00128             return(new MxPEGParser());
00129          }
00130       };
00131     public:
00133       static IComponentInvoker *newInvoker() {
00134          return(new Invoker());
00135       }
00136       
00137     public:
00138       enum DecoderState { AwaitMarker,
00139                           StartOfImage,
00140                           RecordStartOfImage,
00141                           APP0,
00142                           Comment,
00143                           M1IMG,
00144                           MxF,
00145                           QuantizationTable,
00146                           HuffmanTable,
00147                           DefineRestartInterval,
00148                           BitMap,
00149                           StartOfFrame,
00150                           StartOfScan,
00151                           Scan,
00152                           Audio,
00153                           ReadPayloadAndReturn,
00154                           NoGoodState
00155                         };
00156       
00157     private:
00158       IStreamSource                *Source;
00159       IUndecodedMxPEGFrameReceiver *FrameReceiver;
00160       bool                         Active;
00161       
00162       // state machine datafields...
00163       DecoderState State;
00164       unsigned char *CurrentBytePtr;
00165       int BytesLeft;
00166       int AwaitMarkerStage;
00167       int ReadMarkerStage;
00168       unsigned char ReadMarkerFirstLenByte;
00169       int MarkerPayloadSize,
00170           MarkerBytesNeeded;
00171       int ScanStage;
00172       unsigned char *MarkerPayload;
00173       
00174       mxmUndecodedMxPEGFrameDescriptor FrameDescriptor;
00175       int Width, Height;
00176       
00177       unsigned char *PrefetchBuffer;
00178       int PrefetchBuffSize;
00179       int PrefetchedBytes;
00180       
00181       bool Fresh;
00182       mxmLocalEndian LocalEndian;
00183       
00184       bool ErrorEncountered;
00185       
00186     public:
00187       MxPEGParser();
00188       ~MxPEGParser();
00189     
00190     public:
00192       mxm::smart<mxmStringList> enumerateInterfaces();
00194       mxm::smart<mxmStringList> enumerateCapabilities(
00195                                    const mxmString &interface);
00196       
00198       void setStreamSource(IStreamSource *stream_source);
00200       void setUndecodedMxPEGFrameReceiver(IUndecodedMxPEGFrameReceiver
00201                                            *frame_receiver);
00203       int processStreamBytes(int num);
00205       bool sourceStillUp();
00206      
00208       bool errorState();
00210       void setErrorState();
00211       
00212     private:
00215       void feedBytes(unsigned char *buffer, int num);
00217       bool awaitMarker(unsigned char *marker_type);
00219       bool readMarkerPayload(void);
00221       bool doScan(void);
00223       void activate();
00224    };
00225 };
00226 
00227 #endif   // __MX_MXPEGPARSER_H__

Generated on Fri Jun 29 17:21:04 2007 for MxPEG SDK by  doxygen 1.4.6