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_UTIL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_VIDEO_UTIL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoFrame; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Computes the size of |visible_size| for a given aspect ratio. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MEDIA_EXPORT gfx::Size GetNaturalSize(const gfx::Size& visible_size, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int aspect_ratio_numerator, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int aspect_ratio_denominator); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copies a plane of YUV(A) source into a VideoFrame object, taking into account 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// source and destinations dimensions. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: rows is *not* the same as height! 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MEDIA_EXPORT void CopyYPlane(const uint8* source, int stride, int rows, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VideoFrame* frame); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MEDIA_EXPORT void CopyUPlane(const uint8* source, int stride, int rows, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VideoFrame* frame); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MEDIA_EXPORT void CopyVPlane(const uint8* source, int stride, int rows, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VideoFrame* frame); 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MEDIA_EXPORT void CopyAPlane(const uint8* source, int stride, int rows, 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VideoFrame* frame); 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Sets alpha plane values to be completely opaque (all 255's). 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MEDIA_EXPORT void MakeOpaqueAPlane(int stride, int rows, VideoFrame* frame); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |plane| is one of VideoFrame::kYPlane, VideoFrame::kUPlane, 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// VideoFrame::kVPlane or VideoFrame::kAPlane 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT void CopyPlane(size_t plane, const uint8* source, int stride, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rows, VideoFrame* frame); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fills |frame| containing YUV data to the given color values. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MEDIA_EXPORT void FillYUV(VideoFrame* frame, uint8 y, uint8 u, uint8 v); 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Fills |frame| containing YUVA data with the given color values. 48116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMEDIA_EXPORT void FillYUVA(VideoFrame* frame, 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint8 y, 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint8 u, 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint8 v, 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint8 a); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates a border in |frame| such that all pixels outside of 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |view_area| are black. The size and position of |view_area| 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// must be even to align correctly with the color planes. 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Only YV12 format video frames are currently supported. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT void LetterboxYUV(VideoFrame* frame, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& view_area); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Rotates |src| plane by |rotation| degree with possible flipping vertically 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and horizontally. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |rotation| is limited to {0, 90, 180, 270}. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |width| and |height| are expected to be even numbers. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Both |src| and |dest| planes are packed and have same |width| and |height|. 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When |width| != |height| and rotated by 90/270, only the maximum square 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// portion located in the center is rotated. For example, for width=640 and 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// height=480, the rotated area is 480x480 located from row 0 through 479 and 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from column 80 through 559. The leftmost and rightmost 80 columns are 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ignored for both |src| and |dest|. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The caller is responsible for blanking out the margin area. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT void RotatePlaneByPixels( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint8* src, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8* dest, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int width, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int height, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rotation, // Clockwise. 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool flip_vert, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool flip_horiz); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Return the largest centered rectangle with the same aspect ratio of |content| 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// that fits entirely inside of |bounds|. If |content| is empty, its aspect 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// ratio would be undefined; and in this case an empty Rect would be returned. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT gfx::Rect ComputeLetterboxRegion(const gfx::Rect& bounds, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& content); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copy an RGB bitmap into the specified |region_in_frame| of a YUV video frame. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fills the regions outside |region_in_frame| with black. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT void CopyRGBToVideoFrame(const uint8* source, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int stride, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& region_in_frame, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VideoFrame* frame); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_VIDEO_UTIL_H_ 97