pic_io.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:13k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: pic_io.h,v 1.2 2005/01/30 05:11:40 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Thomas Davies (Original Author),
  24. *                 Scott Robert Ladd,
  25. *                 Stuart Cunningham,
  26. *                 Tim Borer,
  27. *                 Anuradha Suraparaju
  28. *
  29. * Alternatively, the contents of this file may be used under the terms of
  30. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  31. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  32. * the GPL or the LGPL are applicable instead of those above. If you wish to
  33. * allow use of your version of this file only under the terms of the either
  34. * the GPL or LGPL and not to allow others to use your version of this file
  35. * under the MPL, indicate your decision by deleting the provisions above
  36. * and replace them with the notice and other provisions required by the GPL
  37. * or LGPL. If you do not delete the provisions above, a recipient may use
  38. * your version of this file under the terms of any one of the MPL, the GPL
  39. * or the LGPL.
  40. * ***** END LICENSE BLOCK ***** */
  41. #ifndef _PIC_IO_H_
  42. #define _PIC_IO_H_
  43. #include <iostream>
  44. #include <fstream>
  45. #include <streambuf>
  46. #include <libdirac_common/common.h>
  47. #include <libdirac_common/frame.h>
  48. namespace dirac
  49. {
  50.     //////////////////////////////////////////
  51.     //--------------------------------------//
  52.     //-                                    -//
  53.     //-Uncompressed picture file IO wrapper-//
  54.     //-                                    -//
  55.     //--------------------------------------//
  56.     //////////////////////////////////////////
  57.     // Stream classes for writing/reading frames of uncompressed/decoded data
  58.     // to stream. Streams currently supported are Memory based streams and
  59.     // File based streams. These classes need further restructuring. 
  60.     // Anu - 19-11-2004
  61.     // Subclass these to provide functionality for different file formats and 
  62.     // for streaming.
  63.     //! Class for outputting pictures
  64.     /*!
  65.         Abstract base class for classes that output frames to stream
  66.     */
  67.     class StreamPicOutput
  68.     {
  69.         public:
  70.             //! Default Constructor
  71.             StreamPicOutput();
  72.             //! Constructor
  73.             /*!
  74.                 Constructor, takes
  75.                 param sp the sequence parameters
  76.              */  
  77.             StreamPicOutput( const SeqParams& sp);
  78.             //! virtual Destructor
  79.             virtual ~StreamPicOutput();
  80.             //! Write the next frame to the output
  81.             virtual bool WriteNextFrame(const Frame& myframe);
  82.             //! Get the sequence parameters 
  83.             SeqParams& GetSeqParams() {return m_sparams;}
  84.         protected:
  85.             //! Sequence parameters
  86.             SeqParams m_sparams;
  87.             //! Output stream
  88.             std::ostream* m_op_pic_ptr;
  89.             //! Write a component to file
  90.             virtual bool WriteComponent(const PicArray& pic_data, 
  91.                                         const CompSort& cs);
  92.     };
  93.     /*!
  94.         Outputs pictures to a memory buffer
  95.     */
  96.     class MemoryStreamOutput : public StreamPicOutput
  97.     {
  98.         public:
  99.             //! Default Constructor
  100.             MemoryStreamOutput();
  101.             //! Destructor
  102.             ~MemoryStreamOutput();
  103.             //! Set sequence parameters
  104.             void SetSequenceParams ( SeqParams &sparams)
  105.             { m_sparams = sparams; }
  106.             //! Set the memory buffer to write the data to
  107.             void SetMembufReference (unsigned char *buf, int buf_size);
  108.             //! Returns true if we're at the end of the input, false otherwise
  109.             bool End() const ;
  110.         protected:
  111.             //! Body-less copy constructor
  112.             MemoryStreamOutput(const MemoryStreamOutput&);
  113.             //! Body-less assignment operator
  114.             MemoryStreamOutput & operator =(const MemoryStreamOutput&);
  115.         protected:
  116.             //! local memory buffer
  117.             class OutputMemoryBuffer : public std::streambuf
  118.             {
  119.             public:
  120.                 //! Memory buffer constructor
  121.                 OutputMemoryBuffer () : 
  122.                 m_op_buf(0), 
  123.                 m_op_buf_size(0), 
  124.                 m_op_idx(0)
  125.                 {}
  126.                 //! Set the buffer variables
  127.                 /*! Set the memory buffer variables
  128.                     param   buffer      buffer to write data to
  129.                     param   buffer_size size of output buffer
  130.                 */
  131.                 void SetMembufReference (unsigned char *buffer, int buffer_size)
  132.                 {
  133.                     m_op_buf = buffer;
  134.                     m_op_buf_size = buffer_size;
  135.                     m_op_idx = 0;
  136.                 }
  137.             protected:
  138.                 //! Memory buffer to write data to
  139.                 unsigned char *m_op_buf;
  140.                 //! Memory buffer size
  141.                 int m_op_buf_size;
  142.                 //! Index of first available byte in buffer
  143.                 int m_op_idx;
  144.                 //! Write Overflow method to write one char at a time 
  145.                 virtual int overflow (int c)
  146.                 {
  147.                     if ( c != EOF)
  148.                     {
  149.                         if (m_op_idx == m_op_buf_size)
  150.                             return EOF;
  151.                         m_op_buf[m_op_idx] = (char)c;
  152.                         m_op_idx++;
  153.                     }
  154.                     return c;
  155.                 }
  156.                 //! xsputn method to write one multiple chars at a time to buffer
  157.                 virtual std::streamsize xsputn (const char *s, 
  158.                                             std::streamsize num)
  159.                 {
  160.                     std::streamsize bytes_left = m_op_buf_size - m_op_idx;
  161.                     std::streamsize bytes_written = bytes_left > num 
  162.                                                         ? num : bytes_left;
  163.                     memcpy (&m_op_buf[m_op_idx], (unsigned char *)s, 
  164.                             bytes_written);
  165.                     m_op_idx += bytes_written;
  166.                     return bytes_written;
  167.                 }
  168.             private:
  169.                 //! Body-less copy constructor
  170.                 OutputMemoryBuffer(const OutputMemoryBuffer&);
  171.                 //! Body-less assignment operator
  172.                 OutputMemoryBuffer& operator =(const OutputMemoryBuffer&);
  173.             };
  174.             //! Output stream Memory buffer
  175.             OutputMemoryBuffer m_membuf;
  176.     };
  177.     /*!
  178.         Outputs pictures to a file
  179.     */
  180.     class FileStreamOutput : public StreamPicOutput
  181.     {
  182.         public:
  183.             //! Constructor
  184.             /*!
  185.                 Constructor, takes
  186.                 param output_name the name of the output file
  187.                 param sp the sequence parameters
  188.                 param write_header_only optionally write only the header
  189.              */  
  190.             FileStreamOutput (const char* output_name,
  191.               const SeqParams& sp,
  192.               bool write_header_only = false);
  193.             //! Destructor
  194.             virtual ~FileStreamOutput ();
  195.             //! Write the picture sequence header
  196.             virtual bool WritePicHeader();
  197.         protected:
  198.             //! Header output stream
  199.             std::ofstream* m_op_head_ptr;
  200.             //! Open picture's header file for output
  201.             virtual bool OpenHeader(const char* output_name);
  202.             //! Open picture's YUV data file for output
  203.             virtual bool OpenYUV(const char* output_name);
  204.     };
  205.     //! Picture input class
  206.     /*!
  207.         Abstract Class for reading picture data from a stream.
  208.      */
  209.     class StreamPicInput
  210.     {
  211.         public:
  212.             //! Default Constructor
  213.             StreamPicInput();
  214.             //! Constructor
  215.             /*!
  216.                 Constructor, takes
  217.                 param ip_pic_ptr input stream to read from
  218.                 param sparams    Sequence parameters
  219.              */
  220.             StreamPicInput(std::istream *ip_pic_ptr, const SeqParams& sparams);
  221.             //! Destructor
  222.             virtual ~StreamPicInput();
  223.             //! Skip n frames of input
  224.             virtual void Skip( const int n) = 0;
  225.             //! Set padding values to take into account block and transform sizes
  226.             void SetPadding(const int xpd, const int ypd);
  227.             //! Read the next frame from the file
  228.             virtual bool ReadNextFrame(Frame& myframe);
  229.             //! Get the sequence parameters (got from the picture header)
  230.             const SeqParams& GetSeqParams() const {return m_sparams;}
  231.             //! Returns true if we're at the end of the input, false otherwise
  232.             bool End() const ;
  233.         protected:
  234.             //! Sequence parameters
  235.             SeqParams m_sparams;
  236.             //! Input stream
  237.             std::istream* m_ip_pic_ptr;
  238.             //!padding values
  239.             int m_xpad,m_ypad;
  240.             //! Read a component from the file
  241.             virtual bool ReadComponent(PicArray& pic_data,const CompSort& cs);
  242.     };
  243.     /*!
  244.         Class for reading picture data from memory
  245.      */
  246.     class MemoryStreamInput : public StreamPicInput
  247.     {
  248.         public:
  249.             //! Default constructor
  250.             MemoryStreamInput();
  251.             //! Destructor
  252.             ~MemoryStreamInput();
  253.             //! Set the seqence parameters
  254.             void SetSequenceParams ( SeqParams &sparams)
  255.             { m_sparams = sparams; }
  256.             //! Set Memory buffer
  257.             /*! Set the input memory buffer variables
  258.                 param    buf      Input Buffer to read data from
  259.                 param    buf_size Input buffer size
  260.             */
  261.             void SetMembufReference (unsigned char *buf, int buf_size);
  262.             //! Returns true if we're at the end of the input, false otherwise
  263.             bool End() const ;
  264.             //! Skip n frame of input. Unimplemented to this class
  265.             virtual void Skip( const int n);
  266.         protected:
  267.             //! Body-less copy constructor
  268.             MemoryStreamInput(const MemoryStreamInput&);
  269.             //! Body-less assignment operator
  270.             MemoryStreamInput & operator =(const MemoryStreamInput&);
  271.         protected:
  272.             //! Class that defines the Input Stream Memory Buffer
  273.             class InputMemoryBuffer : public std::streambuf
  274.             {
  275.             public:
  276.                 //! Constructor
  277.                 InputMemoryBuffer() : m_buffer(0), m_buffer_size(0)
  278.                 {
  279.                     setg ((char *)m_buffer, (char *)m_buffer, (char *)m_buffer);
  280.                 }
  281.                 //! Destructor
  282.                 ~InputMemoryBuffer(){}
  283.                 //! Set Input Memory buffer variables
  284.                 /*! Initialises the input memory buffer vars
  285.                     param   buffer       Input memory buffer
  286.                     param   buffer_size  Input memory buffer size
  287.                 */
  288.                 void SetMembufReference (unsigned char *buffer, int buffer_size)
  289.                 {
  290.                     m_buffer = buffer;
  291.                     m_buffer_size = buffer_size;
  292.                     setg ((char *)m_buffer, (char *)m_buffer, 
  293.                                 (char *)(m_buffer + buffer_size));
  294.                 }
  295.             private:
  296.                 //! Body-less copy constructor
  297.                 InputMemoryBuffer (const InputMemoryBuffer& inbuf);
  298.                 //! Body-less assignment operator
  299.                 InputMemoryBuffer& operator = (const InputMemoryBuffer& inbuf);
  300.                 //! Input memory buffer
  301.                 unsigned char *m_buffer;
  302.                 //! Input memory buffer size
  303.                 int m_buffer_size;
  304.             };
  305.             //! Input stream buffer
  306.             InputMemoryBuffer m_membuf;
  307.     };
  308.     //! Picture input class
  309.     /*!
  310.         Class for reading picture data from a file.
  311.      */
  312.     class FileStreamInput : public StreamPicInput
  313.     {
  314.         public:
  315.             //! Constructor
  316.             /*!
  317.                 Constructor, takes
  318.                 param input_name the name of the input picture file
  319.              */
  320.             FileStreamInput (const char* input_name);
  321.             //! Destructor
  322.             virtual ~FileStreamInput ();
  323.             //! Read the picture header
  324.             virtual bool ReadPicHeader();
  325.             //! Skip n frames of input
  326.             virtual void Skip( const int n);
  327.         protected:
  328.             //! input header stream
  329.             std::ifstream* m_ip_head_ptr;
  330.     };
  331. } // namespace dirac
  332. #endif