Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

mxcpcBufferedMxPEGDecoderBackEnd.cpp

00001 //           ///          //                                        Mx clientSDK
00002 //          /////        ////                    Mx Crossplatform Client Library
00003 //         /// XXX     XXX ///
00004 //        ///    XXX XXX    ///     $RCSfile: mxcpcBufferedMxPEGDecoderBackEnd.cpp,v $
00005 //       ///       XXX       ///     $Revision: 1.1 $
00006 //      ///      XXX XXX      ///     $Date: 2006/01/11 19:07:06 $
00007 //     ////    XXX     XXX    ////     $Author: cvs-kai $
00008 //    ////                     ////
00009 //   ////  M  O  B  O  T  I  X  ////////////////////////////////////////////////
00010 //  //// Security Vision Systems //////////////////////////////////////////////
00011 //                                                                          //
00012 //  Copyright (C) 2005 - 2006, MOBOTIX AG, Germany                         //
00013 //  This software is made available under the BSD licence. Please refer   //
00014 //  to the file LICENCE.TXT contained in this distribution for details.  //
00015 //                                                                      //
00016 //  /////////////////////////////////////////////////////////////////////
00017 
00018 
00019 
00020 #include <mxcpcBufferedMxPEGDecoderBackEnd.h>
00021 
00022 #include <cstdio>
00023 #include <memory>
00024 
00025 
00026 
00027 mxcpcBufferedMxPEGDecoderBackEnd::mxcpcBufferedMxPEGDecoderBackEnd() {
00028   
00029   Width = Height = 0;
00030   TileNumX = TileNumY = 0;
00031   
00032   PixelBuffer = 0;
00033   PixelBufferOffset = 0;
00034 }
00035 
00036 
00037 mxcpcBufferedMxPEGDecoderBackEnd::~mxcpcBufferedMxPEGDecoderBackEnd() {
00038 
00039   delete[] PixelBuffer;
00040 }
00041 
00042 
00043 
00044 void mxcpcBufferedMxPEGDecoderBackEnd::videoResolutionChanged(int width, 
00045                                                               int height) {
00046 
00047   int tile_num_x, 
00048       tile_num_y;
00049   char txt[100];
00050   int unused_line_num;
00051         
00052   delete[] PixelBuffer;
00053   
00054   try {
00055     
00056       tile_num_x = width/16;
00057       if(width % 16) tile_num_x++;
00058       tile_num_y = height/16;
00059       if(height % 16) tile_num_y++;
00060          
00061       PixelBuffer = new mxcpc::u32[tile_num_x*tile_num_y * 16*16*3/4];
00062       unused_line_num = height % 16;
00063       if(unused_line_num)
00064        PixelBufferOffset = unused_line_num * (tile_num_x * 3 * 16/4); 
00065       else
00066        PixelBufferOffset = 0;
00067       
00068       Width  = width;
00069       Height = height;
00070       
00071       TileNumX = tile_num_x;
00072       TileNumY = tile_num_y;
00073       
00074       std::sprintf(txt, "mxcpcBufferedMxPEGDecoderBackEnd : "
00075                         "switched video resolution to "
00076                         "%dx%d",
00077                    width, height);
00078       mxcpc::sendStatusMsg(txt);
00079       
00080   } catch(std::bad_alloc) {
00081         
00082       PixelBuffer = 0;
00083       PixelBufferOffset = 0;
00084       Width = Height = 0;
00085       TileNumX = TileNumY = 0;
00086       
00087       std::sprintf(txt, "mxcpcBufferedMxPEGDecoderBackEnd : "
00088                         "!!! failed to switch video reolution to "
00089                         "%dx%d !!!",
00090                    width, height);
00091       mxcpc::sendStatusMsg(txt);
00092       
00093       errorEncountered();
00094   }
00095 }
00096 
00097 
00098 void mxcpcBufferedMxPEGDecoderBackEnd
00099       ::provideVideoTilePixelTarget(int tile_x, int tile_y,
00100                                     mxcpc::u32 **target_ptr,
00101                                     int *row_stepping_ptr)   {
00102    
00103   int rowsize;
00104                                                                      
00105   if(!PixelBuffer) {
00106   
00107     *target_ptr       = DummyTilePixelBuffer;
00108     *row_stepping_ptr = 0;
00109   }
00110   else {
00111   
00112     rowsize = 16*3/4;   // in u32 units
00113  
00114     *target_ptr       = PixelBuffer 
00115                          + (((TileNumY - 1 - tile_y)*16 + 15)*TileNumX + tile_x) * rowsize;
00116     *row_stepping_ptr = -(1 + TileNumX) * rowsize; 
00117   }                                   
00118 }
00119 

Generated on Fri Jan 20 13:33:31 2006 for mxcpc by  doxygen 1.4.4