Blame include/exiv2/matroskavideo.hpp

Packit Service 21b5d1
// ***************************************************************** -*- C++ -*-
Packit Service 21b5d1
/*
Packit Service 21b5d1
 * Copyright (C) 2004-2018 Exiv2 authors
Packit Service 21b5d1
 * This program is part of the Exiv2 distribution.
Packit Service 21b5d1
 *
Packit Service 21b5d1
 * This program is free software; you can redistribute it and/or
Packit Service 21b5d1
 * modify it under the terms of the GNU General Public License
Packit Service 21b5d1
 * as published by the Free Software Foundation; either version 2
Packit Service 21b5d1
 * of the License, or (at your option) any later version.
Packit Service 21b5d1
 *
Packit Service 21b5d1
 * This program is distributed in the hope that it will be useful,
Packit Service 21b5d1
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 21b5d1
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 21b5d1
 * GNU General Public License for more details.
Packit Service 21b5d1
 *
Packit Service 21b5d1
 * You should have received a copy of the GNU General Public License
Packit Service 21b5d1
 * along with this program; if not, write to the Free Software
Packit Service 21b5d1
 * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
Packit Service 21b5d1
 */
Packit Service 21b5d1
/*!
Packit Service 21b5d1
  @file    matroskavideo.hpp
Packit Service 21b5d1
  @brief   An Image subclass to support Matroska video files
Packit Service 21b5d1
  @author  Abhinav Badola for GSoC 2012
Packit Service 21b5d1
           mail.abu.to@gmail.com
Packit Service 21b5d1
  @date    18-Jun-12, AB: created
Packit Service 21b5d1
 */
Packit Service 21b5d1
#ifndef MATROSKAVIDEO_HPP_
Packit Service 21b5d1
#define MATROSKAVIDEO_HPP_
Packit Service 21b5d1
Packit Service 21b5d1
// *****************************************************************************
Packit Service 21b5d1
#include "exiv2lib_export.h"
Packit Service 21b5d1
Packit Service 21b5d1
// included header files
Packit Service 21b5d1
#include "image.hpp"
Packit Service 21b5d1
Packit Service 21b5d1
// *****************************************************************************
Packit Service 21b5d1
// namespace extensions
Packit Service 21b5d1
namespace Exiv2 {
Packit Service 21b5d1
Packit Service 21b5d1
// *****************************************************************************
Packit Service 21b5d1
// class definitions
Packit Service 21b5d1
Packit Service 21b5d1
    // Add MKV to the supported image formats
Packit Service 21b5d1
    namespace ImageType {
Packit Service 21b5d1
        const int mkv = 21; //!< Treating mkv as an image type>
Packit Service 21b5d1
    }
Packit Service 21b5d1
Packit Service 21b5d1
    // Todo: Should be hidden
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief Helper structure for the Matroska tags lookup table.
Packit Service 21b5d1
     */
Packit Service 21b5d1
    struct EXIV2LIB_DEPRECATED MatroskaTags {
Packit Service 21b5d1
        uint64_t val_;                          //!< Tag value
Packit Service 21b5d1
        const char* label_;                     //!< Translation of the tag value
Packit Service 21b5d1
Packit Service 21b5d1
        //! Comparison operator for use with the find template
Packit Service 21b5d1
       bool operator==(uint64_t key) const { return val_ == key; }
Packit Service 21b5d1
    }; // struct TagDetails
Packit Service 21b5d1
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief Class to access Matroska video files.
Packit Service 21b5d1
     */
Packit Service 21b5d1
    class EXIV2LIB_DEPRECATED_EXPORT MatroskaVideo : public Image {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Constructor for a Matroska video. Since the constructor
Packit Service 21b5d1
              can not return a result, callers should check the good() method
Packit Service 21b5d1
              after object construction to determine success or failure.
Packit Service 21b5d1
          @param io An auto-pointer that owns a BasicIo instance used for
Packit Service 21b5d1
              reading and writing image metadata. \b Important: The constructor
Packit Service 21b5d1
              takes ownership of the passed in BasicIo instance through the
Packit Service 21b5d1
              auto-pointer. Callers should not continue to use the BasicIo
Packit Service 21b5d1
              instance after it is passed to this method. Use the Image::io()
Packit Service 21b5d1
              method to get a temporary reference.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        MatroskaVideo(BasicIo::AutoPtr io);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        void readMetadata();
Packit Service 21b5d1
        void writeMetadata();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        std::string mimeType() const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
Packit Service 21b5d1
    protected:
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Function used to calulate the size of a block.
Packit Service 21b5d1
              This information is only stored in one byte.
Packit Service 21b5d1
              The size of the block is calculated by counting
Packit Service 21b5d1
              the number of leading zeros in the binary code of the byte.
Packit Service 21b5d1
              Size = (No. of leading zeros + 1) bytes
Packit Service 21b5d1
          @param b The byte, which stores the information to calculate the size
Packit Service 21b5d1
          @return Return the size of the block.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        uint32_t findBlockSize(byte b);
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Check for a valid tag and decode the block at the current IO position.
Packit Service 21b5d1
              Calls contentManagement() or skips to next tag, if required.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        void decodeBlock();
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Interpret tag information, and save it in the respective XMP container.
Packit Service 21b5d1
          @param mt Pointer to current tag,
Packit Service 21b5d1
          @param buf Pointer to the memory area with the tag information.
Packit Service 21b5d1
          @param size Size of \em buf.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        void contentManagement(const MatroskaTags* mt, const byte* buf, long size);
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Calculates Aspect Ratio of a video, and stores it in the
Packit Service 21b5d1
              respective XMP container.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        void aspectRatio();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        //! @name NOT Implemented
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Copy constructor
Packit Service 21b5d1
        MatroskaVideo(const MatroskaVideo& rhs);
Packit Service 21b5d1
        //! Assignment operator
Packit Service 21b5d1
        MatroskaVideo& operator=(const MatroskaVideo& rhs);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        //! Variable to check the end of metadata traversing.
Packit Service 21b5d1
        bool continueTraversing_;
Packit Service 21b5d1
        //! Variable to store height and width of a video frame.
Packit Service 21b5d1
        uint64_t height_, width_;
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class MatroskaVideo
Packit Service 21b5d1
Packit Service 21b5d1
// *****************************************************************************
Packit Service 21b5d1
// template, inline and free functions
Packit Service 21b5d1
Packit Service 21b5d1
    // These could be static private functions on Image subclasses but then
Packit Service 21b5d1
    // ImageFactory needs to be made a friend.
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief Create a new MatroskaVideo instance and return an auto-pointer to it.
Packit Service 21b5d1
          Caller owns the returned object and the auto-pointer ensures that
Packit Service 21b5d1
          it will be deleted.
Packit Service 21b5d1
     */
Packit Service 21b5d1
    EXIV2LIB_DEPRECATED_EXPORT Image::AutoPtr newMkvInstance(BasicIo::AutoPtr io, bool create);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Check if the file iIo is a Matroska Video.
Packit Service 21b5d1
    EXIV2LIB_DEPRECATED_EXPORT bool isMkvType(BasicIo& iIo, bool advance);
Packit Service 21b5d1
Packit Service 21b5d1
}                                       // namespace Exiv2
Packit Service 21b5d1
Packit Service 21b5d1
#endif                                  // #ifndef MATROSKAVIDEO_HPP_