summaryrefslogtreecommitdiffstats
path: root/remoting/base/decoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'remoting/base/decoder.h')
-rw-r--r--remoting/base/decoder.h41
1 files changed, 24 insertions, 17 deletions
diff --git a/remoting/base/decoder.h b/remoting/base/decoder.h
index 82211a7..bcb5a54 100644
--- a/remoting/base/decoder.h
+++ b/remoting/base/decoder.h
@@ -5,6 +5,8 @@
#ifndef REMOTING_BASE_DECODER_H_
#define REMOTING_BASE_DECODER_H_
+#include <vector>
+
#include "base/task.h"
#include "base/scoped_ptr.h"
#include "gfx/rect.h"
@@ -21,34 +23,39 @@ typedef std::vector<gfx::Rect> UpdatedRects;
// TODO(ajwong): Beef up this documentation once the API stablizes.
class Decoder {
public:
+ // DecodeResult is returned from DecodePacket() and indicates current state
+ // of the decoder. DECODE_DONE means that last packet for the frame was
+ // processed, and the frame can be displayed now. DECODE_IN_PROGRESS
+ // indicates that the decoder must receive more data before the frame can be
+ // displayed. DECODE_ERROR is returned if there was an error in the stream.
+ enum DecodeResult {
+ DECODE_ERROR = -1,
+ DECODE_IN_PROGRESS,
+ DECODE_DONE,
+ };
+
Decoder() {}
virtual ~Decoder() {}
- // TODO(ajwong): This API is incorrect in the face of a streaming decode
- // protocol like VP8. However, it breaks the layering abstraction by
- // depending on the network packet protocol buffer type. I'm going to go
- // forward with it as is, and then refactor again to support streaming
- // decodes.
-
// Initializes the decoder to draw into the given |frame|. The |clip|
// specifies the region to draw into. The clip region must fit inside
- // the dimensions of frame. Failure to do so will CHECK Fail.
- //
- // TODO(ajwong): Should this take the source pixel format?
- // TODO(ajwong): Should the protocol be split into basic-types followed
- // by packet types? Basic types might include the format enum below.
- virtual void Initialize(scoped_refptr<media::VideoFrame> frame,
- const gfx::Rect& clip, int bytes_per_src_pixel) = 0;
+ // the dimensions of frame. Failure to do so will CHECK fail.
+ virtual void Initialize(scoped_refptr<media::VideoFrame> frame) = 0;
+
+ // Feeds more data into the decoder.
+ virtual DecodeResult DecodePacket(const VideoPacket* packet) = 0;
+
+ // Returns rects that were updated in the last frame. Can be called only
+ // after DecodePacket returned DECODE_DONE. Caller keeps ownership of
+ // |rects|. |rects| is kept empty if whole screen needs to be updated.
+ virtual void GetUpdatedRects(UpdatedRects* rects) = 0;
// Reset the decoder to an uninitialized state. Release all references to
// the initialized |frame|. Initialize() must be called before the decoder
// is used again.
virtual void Reset() = 0;
- // Feeds more data into the decoder.
- virtual void DecodeBytes(const std::string& encoded_bytes) = 0;
-
- // Returns true if decoder is ready to accept data via ProcessRectangleData.
+ // Returns true if decoder is ready to accept data via DecodePacket.
virtual bool IsReadyForData() = 0;
virtual VideoPacketFormat::Encoding Encoding() = 0;