/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. * Copyright 2014 Pierre Ossman for Cendio AB * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #ifndef __RFB_DECODER_H__ #define __RFB_DECODER_H__ namespace rdr { class InStream; class OutStream; } namespace rfb { class ConnParams; class ModifiablePixelBuffer; class Region; struct Rect; enum DecoderFlags { // A constant for decoders that don't need anything special DecoderPlain = 0, // All rects for this decoder must be handled in order DecoderOrdered = 1 << 0, // Only some of the rects must be handled in order, // see doesRectsConflict() DecoderPartiallyOrdered = 1 << 1, }; class Decoder { public: Decoder(enum DecoderFlags flags); virtual ~Decoder(); // These functions are the main interface to an individual decoder // readRect() transfers data for the given rectangle from the // InStream to the OutStream, possibly changing it along the way to // make it easier to decode. This function will always be called in // a serial manner on the main thread. virtual void readRect(const Rect& r, rdr::InStream* is, const ConnParams& cp, rdr::OutStream* os)=0; // These functions will be called from any of the worker threads. // A lock will be held whilst these are called so it is safe to // read and update internal state as necessary. // getAffectedRegion() returns the parts of the frame buffer will // be either read from or written do when decoding this rect. The // default implementation simply returns the given rectangle. virtual void getAffectedRegion(const Rect& rect, const void* buffer, size_t buflen, const ConnParams& cp, Region* region); // doesRectsConflict() determines if two rectangles must be decoded // in the order they were received. This will only be called if the // DecoderPartiallyOrdered flag has been set. virtual bool doRectsConflict(const Rect& rectA, const void* bufferA, size_t buflenA, const Rect& rectB, const void* bufferB, size_t buflenB, const ConnParams& cp); // decodeRect() decodes the given rectangle with data from the // given buffer, onto the ModifiablePixelBuffer. The PixelFormat of // the PixelBuffer might not match the ConnParams and it is up to // the decoder to do any necessary conversion. virtual void decodeRect(const Rect& r, const void* buffer, size_t buflen, const ConnParams& cp, ModifiablePixelBuffer* pb)=0; public: static bool supported(int encoding); static Decoder* createDecoder(int encoding); public: const enum DecoderFlags flags; }; } #endif