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); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates a border in |frame| such that all pixels outside of 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |view_area| are black. The size and position of |view_area| 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// must be even to align correctly with the color planes. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Only YV12 format video frames are currently supported. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT void LetterboxYUV(VideoFrame* frame, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& view_area); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Rotates |src| plane by |rotation| degree with possible flipping vertically 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and horizontally. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |rotation| is limited to {0, 90, 180, 270}. 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |width| and |height| are expected to be even numbers. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Both |src| and |dest| planes are packed and have same |width| and |height|. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When |width| != |height| and rotated by 90/270, only the maximum square 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// portion located in the center is rotated. For example, for width=640 and 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// height=480, the rotated area is 480x480 located from row 0 through 479 and 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from column 80 through 559. The leftmost and rightmost 80 columns are 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ignored for both |src| and |dest|. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The caller is responsible for blanking out the margin area. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT void RotatePlaneByPixels( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint8* src, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8* dest, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int width, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int height, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rotation, // Clockwise. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool flip_vert, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool flip_horiz); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Return the largest centered rectangle with the same aspect ratio of |content| 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// that fits entirely inside of |bounds|. If |content| is empty, its aspect 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// ratio would be undefined; and in this case an empty Rect would be returned. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT gfx::Rect ComputeLetterboxRegion(const gfx::Rect& bounds, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& content); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copy an RGB bitmap into the specified |region_in_frame| of a YUV video frame. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fills the regions outside |region_in_frame| with black. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT void CopyRGBToVideoFrame(const uint8* source, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int stride, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& region_in_frame, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VideoFrame* frame); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_VIDEO_UTIL_H_ 90