summaryrefslogtreecommitdiffstats
path: root/media/base/video_frame.h
diff options
context:
space:
mode:
Diffstat (limited to 'media/base/video_frame.h')
-rw-r--r--media/base/video_frame.h111
1 files changed, 111 insertions, 0 deletions
diff --git a/media/base/video_frame.h b/media/base/video_frame.h
new file mode 100644
index 0000000..b84d77c
--- /dev/null
+++ b/media/base/video_frame.h
@@ -0,0 +1,111 @@
+// Copyright (c) 2010 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_BASE_VIDEO_FRAME_H_
+#define MEDIA_BASE_VIDEO_FRAME_H_
+
+#include "media/base/buffers.h"
+
+namespace media {
+
+class VideoFrame : public StreamSample {
+ public:
+ static const size_t kMaxPlanes = 3;
+
+ static const size_t kNumRGBPlanes = 1;
+ static const size_t kRGBPlane = 0;
+
+ static const size_t kNumYUVPlanes = 3;
+ static const size_t kYPlane = 0;
+ static const size_t kUPlane = 1;
+ static const size_t kVPlane = 2;
+
+ // Surface formats roughly based on FOURCC labels, see:
+ // http://www.fourcc.org/rgb.php
+ // http://www.fourcc.org/yuv.php
+ enum Format {
+ INVALID, // Invalid format value. Used for error reporting.
+ RGB555, // 16bpp RGB packed 5:5:5
+ RGB565, // 16bpp RGB packed 5:6:5
+ RGB24, // 24bpp RGB packed 8:8:8
+ RGB32, // 32bpp RGB packed with extra byte 8:8:8
+ RGBA, // 32bpp RGBA packed 8:8:8:8
+ YV12, // 12bpp YVU planar 1x1 Y, 2x2 VU samples
+ YV16, // 16bpp YVU planar 1x1 Y, 2x1 VU samples
+ EMPTY, // An empty frame.
+ };
+
+ public:
+ // Creates a new frame with given parameters. Buffers for the frame are
+ // allocated but not initialized.
+ static void CreateFrame(Format format,
+ size_t width,
+ size_t height,
+ base::TimeDelta timestamp,
+ base::TimeDelta duration,
+ scoped_refptr<VideoFrame>* frame_out);
+
+ // Creates a frame with format equals to VideoFrame::EMPTY, width, height
+ // timestamp and duration are all 0.
+ static void CreateEmptyFrame(scoped_refptr<VideoFrame>* frame_out);
+
+ // Allocates YV12 frame based on |width| and |height|, and sets its data to
+ // the YUV equivalent of RGB(0,0,0).
+ static void CreateBlackFrame(int width, int height,
+ scoped_refptr<VideoFrame>* frame_out);
+
+ Format format() const { return format_; }
+
+ size_t width() const { return width_; }
+
+ size_t height() const { return height_; }
+
+ size_t planes() const { return planes_; }
+
+ int32 stride(size_t plane) const { return strides_[plane]; }
+
+ // Returns pointer to the buffer for a given plane. The memory is owned by
+ // VideoFrame object and must not be freed by the caller.
+ uint8* data(size_t plane) const { return data_[plane]; }
+
+ // StreamSample interface.
+ virtual bool IsEndOfStream() const;
+
+ private:
+ // Clients must use the static CreateFrame() method to create a new frame.
+ VideoFrame(Format format,
+ size_t video_width,
+ size_t video_height);
+
+ virtual ~VideoFrame();
+
+ // Used internally by CreateFrame().
+ bool AllocateRGB(size_t bytes_per_pixel);
+ bool AllocateYUV();
+
+ // Frame format.
+ Format format_;
+
+ // Width and height of surface.
+ size_t width_;
+ size_t height_;
+
+ // Number of planes, typically 1 for packed RGB formats and 3 for planar
+ // YUV formats.
+ size_t planes_;
+
+ // Array of strides for each plane, typically greater or equal to the width
+ // of the surface divided by the horizontal sampling period. Note that
+ // strides can be negative.
+ int32 strides_[kMaxPlanes];
+
+ // Array of data pointers to each plane.
+ uint8* data_[kMaxPlanes];
+
+ DISALLOW_COPY_AND_ASSIGN(VideoFrame);
+};
+
+} // namespace media
+
+#endif // MEDIA_BASE_VIDEO_FRAME_H_