Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGVIDEOUTILS_H_
#define DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGVIDEOUTILS_H_
#include "MediaData.h"
#include "libavcodec/version.h"
#include "libavutil/pixfmt.h"
#if LIBAVCODEC_VERSION_MAJOR < 54
# ifndef AV_PIX_FMT_YUV420P10LE
# define AV_PIX_FMT_YUV420P10LE PIX_FMT_YUV420P10LE
# endif
# ifndef AV_PIX_FMT_YUV422P
# define AV_PIX_FMT_YUV422P PIX_FMT_YUV422P
# endif
# ifndef AV_PIX_FMT_YUV422P10LE
# define AV_PIX_FMT_YUV422P10LE PIX_FMT_YUV422P10LE
# endif
# ifndef AV_PIX_FMT_YUV444P
# define AV_PIX_FMT_YUV444P PIX_FMT_YUV444P
# endif
# ifndef AV_PIX_FMT_YUV444P10LE
# define AV_PIX_FMT_YUV444P10LE PIX_FMT_YUV444P10LE
# endif
# ifndef AV_PIX_FMT_GBRP
# define AV_PIX_FMT_GBRP PIX_FMT_GBRP
# endif
# ifndef AV_PIX_FMT_GBRP10LE
# define AV_PIX_FMT_GBRP10LE PIX_FMT_GBRP10LE
# endif
#endif
namespace mozilla {
// Fills the chroma plane geometry (Cb/Cr dimensions, chroma subsampling and
// colour depth) of aBuffer from aFormat, an AVPixelFormat value, and the luma
// dimensions aWidth and aHeight. The luma plane (index 0) must already be
// populated by the caller.
inline void SetChromaPlaneGeometryFromAVFormat(VideoData::YCbCrBuffer& aBuffer,
int aFormat, int aWidth,
int aHeight) {
if (aFormat == AV_PIX_FMT_YUV444P || aFormat == AV_PIX_FMT_YUV444P10LE ||
aFormat == AV_PIX_FMT_GBRP || aFormat == AV_PIX_FMT_GBRP10LE
#if LIBAVCODEC_VERSION_MAJOR >= 57
|| aFormat == AV_PIX_FMT_YUV444P12LE
#endif
) {
aBuffer.mPlanes[1].mWidth = aBuffer.mPlanes[2].mWidth = aWidth;
aBuffer.mPlanes[1].mHeight = aBuffer.mPlanes[2].mHeight = aHeight;
if (aFormat == AV_PIX_FMT_YUV444P10LE || aFormat == AV_PIX_FMT_GBRP10LE) {
aBuffer.mColorDepth = gfx::ColorDepth::COLOR_10;
}
#if LIBAVCODEC_VERSION_MAJOR >= 57
else if (aFormat == AV_PIX_FMT_YUV444P12LE) {
aBuffer.mColorDepth = gfx::ColorDepth::COLOR_12;
}
#endif
} else if (aFormat == AV_PIX_FMT_YUV422P || aFormat == AV_PIX_FMT_YUV422P10LE
#if LIBAVCODEC_VERSION_MAJOR >= 57
|| aFormat == AV_PIX_FMT_YUV422P12LE
#endif
) {
aBuffer.mChromaSubsampling = gfx::ChromaSubsampling::HALF_WIDTH;
aBuffer.mPlanes[1].mWidth = aBuffer.mPlanes[2].mWidth = (aWidth + 1) >> 1;
aBuffer.mPlanes[1].mHeight = aBuffer.mPlanes[2].mHeight = aHeight;
if (aFormat == AV_PIX_FMT_YUV422P10LE) {
aBuffer.mColorDepth = gfx::ColorDepth::COLOR_10;
}
#if LIBAVCODEC_VERSION_MAJOR >= 57
else if (aFormat == AV_PIX_FMT_YUV422P12LE) {
aBuffer.mColorDepth = gfx::ColorDepth::COLOR_12;
}
#endif
} else {
aBuffer.mChromaSubsampling = gfx::ChromaSubsampling::HALF_WIDTH_AND_HEIGHT;
aBuffer.mPlanes[1].mWidth = aBuffer.mPlanes[2].mWidth = (aWidth + 1) >> 1;
aBuffer.mPlanes[1].mHeight = aBuffer.mPlanes[2].mHeight =
(aHeight + 1) >> 1;
if (aFormat == AV_PIX_FMT_YUV420P10LE) {
aBuffer.mColorDepth = gfx::ColorDepth::COLOR_10;
}
#if LIBAVCODEC_VERSION_MAJOR >= 57
else if (aFormat == AV_PIX_FMT_YUV420P12LE) {
aBuffer.mColorDepth = gfx::ColorDepth::COLOR_12;
}
#endif
}
}
} // namespace mozilla
#endif // DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGVIDEOUTILS_H_