15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_CODEC_VIDEO_DECODER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_CODEC_VIDEO_DECODER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/video.pb.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace webrtc {
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class DesktopRect;
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class DesktopRegion;
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class DesktopSize;
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace webrtc
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Interface for a decoder that takes a stream of bytes from the network and
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// outputs frames of data.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoDecoder {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static const int kBytesPerPixel = 4;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoDecoder() {}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~VideoDecoder() {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes the decoder and sets the output dimensions.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |screen size| must not be empty.
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void Initialize(const webrtc::DesktopSize& screen_size) = 0;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Feeds more data into the decoder. Returns true if |packet| was processed
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // and the frame can be displayed now.
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual bool DecodePacket(const VideoPacket& packet) = 0;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Marks the specified |region| of the view for update the next time
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderFrame() is called.  |region| is expressed in |view_size| coordinates.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |view_size| must not be empty.
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void Invalidate(const webrtc::DesktopSize& view_size,
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                          const webrtc::DesktopRegion& region) = 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies invalidated pixels within |clip_area| to |image_buffer|. Pixels are
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalidated either by new data received in DecodePacket(), or by explicit
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calls to Invalidate(). |clip_area| is specified in |view_size| coordinates.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |view_size| differs from the source size then the copied pixels will be
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scaled accordingly. |view_size| cannot be empty.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |image_buffer|'s origin must correspond to the top-left of |clip_area|,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the buffer must be large enough to hold |clip_area| RGBA32 pixels.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |image_stride| gives the output buffer's stride in pixels.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On return, |output_region| contains the updated area, in |view_size|
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // coordinates.
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void RenderFrame(const webrtc::DesktopSize& view_size,
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           const webrtc::DesktopRect& clip_area,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           uint8* image_buffer,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int image_stride,
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           webrtc::DesktopRegion* output_region) = 0;
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the "shape", if any, of the most recently rendered frame.
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The shape is returned in source dimensions.
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual const webrtc::DesktopRegion* GetImageShape() = 0;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // REMOTING_CODEC_VIDEO_DECODER_H_
68