video_frame.h revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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 MEDIA_BASE_VIDEO_FRAME_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_VIDEO_FRAME_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <vector> 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/md5.h" 129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/memory/shared_memory.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/synchronization/lock.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/buffers.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SkBitmap; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gpu { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct MailboxHolder; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace gpu 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kFrameSizeAlignment = 16, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kFrameSizePadding = 16, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kFrameAddressAlignment = 32 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kMaxPlanes = 4, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kYPlane = 0, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kUPlane = 1, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kVPlane = 2, 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAPlane = 3, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Surface formats roughly based on FOURCC labels, see: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://www.fourcc.org/rgb.php 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://www.fourcc.org/yuv.php 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Logged to UMA, so never reuse values. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Format { 480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) UNKNOWN = 0, // Unknown format value. 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) YV12 = 1, // 12bpp YVU planar 1x1 Y, 2x2 VU samples 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) YV16 = 2, // 16bpp YVU planar 1x1 Y, 2x1 VU samples 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) I420 = 3, // 12bpp YVU planar 1x1 Y, 2x2 UV samples. 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) YV12A = 4, // 20bpp YUVA planar 1x1 Y, 2x2 VU, 1x1 A samples. 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(VIDEO_HOLE) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HOLE = 5, // Hole frame. 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NATIVE_TEXTURE = 6, // Native texture. Pixel-format agnostic. 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) YV12J = 7, // JPEG color range version of YV12 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FORMAT_MAX = YV12J, // Must always be equal to largest entry logged. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Returns the name of a Format as a string. 623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch static std::string FormatToString(Format format); 633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a new frame in system memory with given parameters. Buffers for 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the frame are allocated but not initialized. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<VideoFrame> CreateFrame( 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Format format, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& coded_size, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& visible_rect, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& natural_size, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta timestamp); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call prior to CreateFrame to ensure validity of frame configuration. Called 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // automatically by VideoDecoderConfig::IsValidConfig(). 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(scherkus): VideoDecoderConfig shouldn't call this method 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsValidConfig(Format format, const gfx::Size& coded_size, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& visible_rect, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& natural_size); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CB to write pixels from the texture backing this frame into the 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |const SkBitmap&| parameter. 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(const SkBitmap&)> ReadPixelsCB; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // CB to be called on the mailbox backing this frame when the frame is 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // destroyed. 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::Callback<void(const std::vector<uint32>&)> ReleaseMailboxCB; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wraps a native texture of the given parameters with a VideoFrame. The 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // backing of the VideoFrame is held in the mailbox held by |mailbox_holder|, 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // and |mailbox_holder_release_cb| will be called with |mailbox_holder| as the 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // argument when the VideoFrame is to be destroyed. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |read_pixels_cb| may be used to do (slow!) readbacks from the 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // texture to main memory. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<VideoFrame> WrapNativeTexture( 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<gpu::MailboxHolder> mailbox_holder, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ReleaseMailboxCB& mailbox_holder_release_cb, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& coded_size, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& visible_rect, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& natural_size, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta timestamp, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ReadPixelsCB& read_pixels_cb); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read pixels from the native texture backing |*this| and write 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // them to |pixels| as BGRA. |pixels| must point to a buffer at 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // least as large as 4 * visible_rect().size().GetArea(). 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ReadPixelsFromNativeTexture(const SkBitmap& pixels); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Wraps packed image data residing in a memory buffer with a VideoFrame. 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The image data resides in |data| and is assumed to be packed tightly in a 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // buffer of logical dimensions |coded_size| with the appropriate bit depth 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // and plane count as given by |format|. The shared memory handle of the 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // backing allocation, if present, can be passed in with |handle|. When the 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // frame is destroyed, |no_longer_needed_cb.Run()| will be called. 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static scoped_refptr<VideoFrame> WrapExternalPackedMemory( 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Format format, 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const gfx::Size& coded_size, 117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const gfx::Rect& visible_rect, 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const gfx::Size& natural_size, 119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch uint8* data, 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) size_t data_size, 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::SharedMemoryHandle handle, 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::TimeDelta timestamp, 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Closure& no_longer_needed_cb); 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wraps external YUV data of the given parameters with a VideoFrame. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The returned VideoFrame does not own the data passed in. When the frame 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is destroyed |no_longer_needed_cb.Run()| will be called. 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // TODO(sheu): merge this into WrapExternalSharedMemory(). 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // http://crbug.com/270217 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_refptr<VideoFrame> WrapExternalYuvData( 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Format format, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& coded_size, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& visible_rect, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& natural_size, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 y_stride, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 u_stride, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 v_stride, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8* y_data, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8* u_data, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8* v_data, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta timestamp, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& no_longer_needed_cb); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Wraps |frame| and calls |no_longer_needed_cb| when the wrapper VideoFrame 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // gets destroyed. |visible_rect| must be a sub rect within 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // frame->visible_rect(). 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static scoped_refptr<VideoFrame> WrapVideoFrame( 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const scoped_refptr<VideoFrame>& frame, 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Rect& visible_rect, 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Size& natural_size, 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::Closure& no_longer_needed_cb); 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Creates a frame which indicates end-of-stream. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static scoped_refptr<VideoFrame> CreateEOSFrame(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allocates YV12 frame based on |size|, and sets its data to the YUV(y,u,v). 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<VideoFrame> CreateColorFrame( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 y, uint8 u, uint8 v, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta timestamp); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allocates YV12 frame based on |size|, and sets its data to the YUV 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equivalent of RGB(0,0,0). 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<VideoFrame> CreateBlackFrame(const gfx::Size& size); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(VIDEO_HOLE) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allocates a hole frame. 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_refptr<VideoFrame> CreateHoleFrame(const gfx::Size& size); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static size_t NumPlanes(Format format); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Returns the required allocation size for a (tightly packed) frame of the 174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // given coded size and format. 175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) static size_t AllocationSize(Format format, const gfx::Size& coded_size); 176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Returns the plane size for a plane of the given coded size and format. 178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static gfx::Size PlaneSize(Format format, 179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t plane, 180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::Size& coded_size); 181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns the required allocation size for a (tightly packed) plane of the 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // given coded size and format. 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static size_t PlaneAllocationSize(Format format, 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t plane, 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size& coded_size); 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Format format() const { return format_; } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& coded_size() const { return coded_size_; } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& visible_rect() const { return visible_rect_; } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& natural_size() const { return natural_size_; } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stride(size_t plane) const; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of bytes per row and number of rows for a given plane. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As opposed to stride(), row_bytes() refers to the bytes representing 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame data scanlines (coded_size.width() pixels, without stride padding). 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row_bytes(size_t plane) const; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows(size_t plane) const; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns pointer to the buffer for a given plane. The memory is owned by 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // VideoFrame object and must not be freed by the caller. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* data(size_t plane) const; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the mailbox holder of the native texture wrapped by this frame. 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only valid to call if this is a NATIVE_TEXTURE frame. Before using the 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // mailbox, the caller must wait for the included sync point. 2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gpu::MailboxHolder* mailbox_holder() const; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns the shared-memory handle, if present 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SharedMemoryHandle shared_memory_handle() const; 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this VideoFrame represents the end of the stream. 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool end_of_stream() const { return end_of_stream_; } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::TimeDelta timestamp() const { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return timestamp_; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void set_timestamp(const base::TimeDelta& timestamp) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timestamp_ = timestamp; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Append |sync_point| into |release_sync_points_| which will be passed to 2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // the video decoder when |mailbox_holder_release_cb_| is called so that 2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // the video decoder waits for the sync points before reusing the mailbox. 2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Multiple clients can append multiple sync points on one frame. 2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // This method is thread safe. Both blink and compositor threads can call it. 2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void AppendReleaseSyncPoint(uint32 sync_point); 2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to keep a running hash of seen frames. Expects an initialized MD5 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // context. Calls MD5Update with the context and the contents of the frame. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HashFrameForTesting(base::MD5Context* context); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<VideoFrame>; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clients must use the static CreateFrame() method to create a new frame. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VideoFrame(Format format, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& coded_size, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& visible_rect, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& natural_size, 2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<gpu::MailboxHolder> mailbox_holder, 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::TimeDelta timestamp, 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool end_of_stream); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VideoFrame(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AllocateYUV(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to DCHECK() plane parameters. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsValidPlane(size_t plane) const; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Frame format. 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const Format format_; 255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Width and height of the video frame, in pixels. This must include pixel 257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // data for the whole image; i.e. for YUV formats with subsampled chroma 258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // planes, in the case that the visible portion of the image does not line up 259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // on a sample boundary, |coded_size_| must be rounded up appropriately and 260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // the pixel data provided for the odd pixels. 261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::Size coded_size_; 262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Width, height, and offsets of the visible portion of the video frame. Must 264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // be a subrect of |coded_size_|. Can be odd with respect to the sample 265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // boundaries, e.g. for formats with subsampled chroma. 266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::Rect visible_rect_; 267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Width and height of the visible portion of the video frame 269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // (|visible_rect_.size()|) with aspect ratio taken into account. 270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const gfx::Size natural_size_; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Array of strides for each plane, typically greater or equal to the width 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the surface divided by the horizontal sampling period. Note that 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // strides can be negative. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 strides_[kMaxPlanes]; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Array of data pointers to each plane. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* data_[kMaxPlanes]; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Native texture mailbox, if this is a NATIVE_TEXTURE frame. 2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const scoped_ptr<gpu::MailboxHolder> mailbox_holder_; 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ReleaseMailboxCB mailbox_holder_release_cb_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadPixelsCB read_pixels_cb_; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Shared memory handle, if this frame was allocated from shared memory. 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SharedMemoryHandle shared_memory_handle_; 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure no_longer_needed_cb_; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta timestamp_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Lock release_sync_point_lock_; 2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::vector<uint32> release_sync_points_; 2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const bool end_of_stream_; 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_IMPLICIT_CONSTRUCTORS(VideoFrame); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_VIDEO_FRAME_H_ 303