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