/* 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_