Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Unified Diff: remoting/base/decoder.h

Issue 3305001: Move decoder into separate thread, clean up API layering, and redo update protocl (Closed)
Patch Set: Fix compile error. Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/base/codec_test.cc ('k') | remoting/base/decoder_row_based.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/base/decoder.h
diff --git a/remoting/base/decoder.h b/remoting/base/decoder.h
index c8c77a779ee568106fbe45bb9a89cb20539eb0b3..355f8ea077cca54c3c997a6eea441466ecd4ffbc 100644
--- a/remoting/base/decoder.h
+++ b/remoting/base/decoder.h
@@ -5,8 +5,6 @@
#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"
@@ -15,82 +13,17 @@
namespace remoting {
-// TODO(hclam): Merge this with the one in remoting/host/encoder.h.
typedef std::vector<gfx::Rect> UpdatedRects;
-// Defines the behavior of a decoder for decoding images received from the
-// host.
-//
-// Sequence of actions with a decoder is as follows:
-//
-// 1. BeginDecode(PartialDecodeDone, DecodeDone, VideoFrame)
-// 2. PartialDecode(ChromotingHostMessage)
-// ...
-// 3. EndDecode()
+// Interface for a decoder that takes a stream of bytes from the network and
+// outputs frames of data.
//
-// The decoder will reply with:
-// 1. PartialDecodeDone(VideoFrame, UpdatedRects)
-// ...
-// 2. DecodeDone(VideoFrame)
-//
-// The format of VideoFrame is a contract between the object that creates the
-// decoder (most likely the renderer) and the decoder.
+// TODO(ajwong): Beef up this documentation once the API stablizes.
class Decoder {
public:
- Decoder()
- : encoding_(EncodingInvalid),
- started_(false) {
- }
- virtual ~Decoder() {
- }
-
- // Tell the decoder to use |frame| as a target to write the decoded image
- // for the coming update stream.
- // If decode is partially done and |frame| can be read, |partial_decode_done|
- // is called and |update_rects| contains the updated regions.
- // If decode is completed |decode_done| is called.
- // Return true if the decoder can writes output to |frame| and accept
- // the codec format.
- // TODO(hclam): Provide more information when calling this function.
- virtual bool BeginDecode(scoped_refptr<media::VideoFrame> frame,
- UpdatedRects* updated_rects,
- Task* partial_decode_done,
- Task* decode_done) = 0;
-
- // Give a ChromotingHostMessage that contains the update stream packet that
- // contains the encoded data to the decoder.
- // The decoder will own |message| and is responsible for deleting it.
- //
- // If the decoder has written something into |frame|,
- // |partial_decode_done_| is called with |frame| and updated regions.
- // Return true if the decoder can accept |message| and decode it.
- //
- // ChromotingHostMessage returned by this method will contain a
- // UpdateStreamPacketMessage.
- // This message will contain either:
- // 1. UpdateStreamBeginRect
- // 2. UpdateStreamRectData
- // 3. UpdateStreamEndRect
- //
- // See remoting/base/protocol/chromotocol.proto for more information about
- // these messages.
- virtual bool PartialDecode(ChromotingHostMessage* message) = 0;
+ Decoder() {}
+ virtual ~Decoder() {}
- // Notify the decoder that we have received the last update stream packet.
- // If the decoding of the update stream has completed |decode_done_| is
- // called with |frame|.
- // If the update stream is not received fully and this method is called the
- // decoder should also call |decode_done_| as soon as possible.
- virtual void EndDecode() = 0;
-
- // Return the encoding type that this decoder handles.
- virtual UpdateStreamEncoding Encoding() { return encoding_; }
-
- // Return the current state of the decoder: 'true' if we're in the middle
- // of BeginDecode() / EndDecode().
- virtual bool IsStarted() { return started_; }
-
- // --- NEW API ---
// 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
@@ -100,53 +33,25 @@ class Decoder {
// 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) {}
+ const gfx::Rect& clip, int bytes_per_src_pixel) = 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() {}
+ virtual void Reset() = 0;
// Feeds more data into the decoder.
- virtual void DecodeBytes(const std::string& encoded_bytes) {}
+ virtual void DecodeBytes(const std::string& encoded_bytes) = 0;
// Returns true if decoder is ready to accept data via ProcessRectangleData.
- virtual bool IsReadyForData() { return false; }
-
- protected:
- // Every decoder will have two internal states because there are three
- // kinds of messages send to PartialDecode().
- //
- // Here's a state diagram:
- //
- // UpdateStreamBeginRect UpdateStreamRectData
- // .............. ............
- // . . . .
- // . v . .
- // kWaitingForBeginRect kWaitingForRectData .
- // ^ . ^ .
- // . . . .
- // .............. ............
- // UpdateStreaEndRect
- enum State {
- // In this state the decoder is waiting for UpdateStreamBeginRect.
- // After receiving UpdateStreaBeginRect, the encoder will transit to
- // to kWaitingForRectData state.
- kWaitingForBeginRect,
-
- // In this state the decoder is waiting for UpdateStreamRectData.
- // The decode remains in this state if UpdateStreamRectData is received.
- // The decoder will transit to kWaitingForBeginRect if UpdateStreamEndRect
- // is received.
- kWaitingForRectData,
- };
-
- // The encoding that this decoder supports.
- UpdateStreamEncoding encoding_;
+ virtual bool IsReadyForData() = 0;
- // Has the decoder been started? I.e., has BeginDecode() been called.
- bool started_;
+ virtual UpdateStreamEncoding Encoding() = 0;
};
} // namespace remoting
« no previous file with comments | « remoting/base/codec_test.cc ('k') | remoting/base/decoder_row_based.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698