// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_VIDEO_PICTURE_H_
#define MEDIA_VIDEO_PICTURE_H_

#include "base/basictypes.h"
#include "gpu/command_buffer/common/mailbox.h"
#include "media/base/media_export.h"
#include "ui/gfx/size.h"

namespace media {

// A picture buffer that is composed of a GLES2 texture.
// This is the media-namespace equivalent of PP_PictureBuffer_Dev.
class MEDIA_EXPORT PictureBuffer {
 public:
  PictureBuffer(int32 id, gfx::Size size, uint32 texture_id);
  PictureBuffer(int32 id,
                gfx::Size size,
                uint32 texture_id,
                const gpu::Mailbox& texture_mailbox);

  // Returns the client-specified id of the buffer.
  int32 id() const {
    return id_;
  }

  // Returns the size of the buffer.
  gfx::Size size() const {
    return size_;
  }

  // Returns the id of the texture.
  // NOTE: The texture id in the renderer process corresponds to a different
  // texture id in the GPU process.
  uint32 texture_id() const {
    return texture_id_;
  }

  const gpu::Mailbox& texture_mailbox() const {
    return texture_mailbox_;
  }

 private:
  int32 id_;
  gfx::Size size_;
  uint32 texture_id_;
  gpu::Mailbox texture_mailbox_;
};

// A decoded picture frame.
// This is the media-namespace equivalent of PP_Picture_Dev.
class MEDIA_EXPORT Picture {
 public:
  Picture(int32 picture_buffer_id, int32 bitstream_buffer_id);

  // Returns the id of the picture buffer where this picture is contained.
  int32 picture_buffer_id() const {
    return picture_buffer_id_;
  }

  // Returns the id of the bitstream buffer from which this frame was decoded.
  int32 bitstream_buffer_id() const {
    return bitstream_buffer_id_;
  }

  void set_bitstream_buffer_id(int32 bitstream_buffer_id) {
    bitstream_buffer_id_ = bitstream_buffer_id;
  }

 private:
  int32 picture_buffer_id_;
  int32 bitstream_buffer_id_;
};

}  // namespace media

#endif  // MEDIA_VIDEO_PICTURE_H_
