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