diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-11-28 17:21:49 +0300 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-11-28 17:21:49 +0300 |
commit | 5ed89f9c263b3edaec2c62c27f1b49cc701cd6ef (patch) | |
tree | 121a33a54942c0493e5f446687da05a4f5cac852 /decoder | |
parent | bd5e23f19a71b45ed2ccad3c40483bdf90f51585 (diff) |
Factor more generic format code out of the avcodec module
Diffstat (limited to 'decoder')
-rw-r--r-- | decoder/LAVVideo/Media.cpp | 39 | ||||
-rw-r--r-- | decoder/LAVVideo/Media.h | 6 | ||||
-rw-r--r-- | decoder/LAVVideo/decoders/avcodec.cpp | 30 |
3 files changed, 45 insertions, 30 deletions
diff --git a/decoder/LAVVideo/Media.cpp b/decoder/LAVVideo/Media.cpp index 1f26f3b2..f1a536bc 100644 --- a/decoder/LAVVideo/Media.cpp +++ b/decoder/LAVVideo/Media.cpp @@ -673,7 +673,7 @@ int flip_plane(BYTE *buffer, int stride, int height) return 0; } -void fillDXVAExtFormat(DXVA2_ExtendedFormat &fmt, int range, int primaries, int matrix, int transfer) +void fillDXVAExtFormat(DXVA2_ExtendedFormat &fmt, int range, int primaries, int matrix, int transfer, int chroma_sample_location) { fmt.value = 0; @@ -755,6 +755,43 @@ void fillDXVAExtFormat(DXVA2_ExtendedFormat &fmt, int range, int primaries, int fmt.VideoTransferFunction = 16; break; } + + // Chroma location + switch (chroma_sample_location) { + case AVCHROMA_LOC_LEFT: + fmt.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2; + break; + case AVCHROMA_LOC_CENTER: + fmt.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG1; + break; + case AVCHROMA_LOC_TOPLEFT: + fmt.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Cosited; + break; + } +} + +void processFFHDRData(MediaSideDataHDR *sd, AVMasteringDisplayMetadata *ff) +{ + if (!sd || !ff) + return; + + // avcodec exports the display primaries in RGB order, we export them in GBR + if (ff->has_primaries) { + sd->display_primaries_x[0] = av_q2d(ff->display_primaries[1][0]); + sd->display_primaries_y[0] = av_q2d(ff->display_primaries[1][1]); + sd->display_primaries_x[1] = av_q2d(ff->display_primaries[2][0]); + sd->display_primaries_y[1] = av_q2d(ff->display_primaries[2][1]); + sd->display_primaries_x[2] = av_q2d(ff->display_primaries[0][0]); + sd->display_primaries_y[2] = av_q2d(ff->display_primaries[0][1]); + + sd->white_point_x = av_q2d(ff->white_point[0]); + sd->white_point_y = av_q2d(ff->white_point[1]); + } + + if (ff->has_luminance) { + sd->max_display_mastering_luminance = av_q2d(ff->max_luminance); + sd->min_display_mastering_luminance = av_q2d(ff->min_luminance); + } } extern "C" const uint8_t *avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state); diff --git a/decoder/LAVVideo/Media.h b/decoder/LAVVideo/Media.h index ae036583..8681d26c 100644 --- a/decoder/LAVVideo/Media.h +++ b/decoder/LAVVideo/Media.h @@ -19,6 +19,9 @@ #pragma once +#include "IMediaSideData.h" +#include "libavutil/mastering_display_metadata.h" + AVCodecID FindCodecId(const CMediaType *mt); int getThreadFlags(AVCodecID codecId); @@ -33,7 +36,8 @@ struct codec_config_t { const codec_config_t *get_codec_config(LAVVideoCodec codec); int flip_plane(BYTE *buffer, int stride, int height); -void fillDXVAExtFormat(DXVA2_ExtendedFormat &fmt, int range, int primaries, int matrix, int transfer); +void fillDXVAExtFormat(DXVA2_ExtendedFormat &fmt, int range, int primaries, int matrix, int transfer, int chroma_sample_location = 0); +void processFFHDRData(MediaSideDataHDR *sd, AVMasteringDisplayMetadata *ff); #define STATE_NOT_FOUND 0 #define STATE_EOS_FOUND 1 diff --git a/decoder/LAVVideo/decoders/avcodec.cpp b/decoder/LAVVideo/decoders/avcodec.cpp index 3bb1910a..84c4769c 100644 --- a/decoder/LAVVideo/decoders/avcodec.cpp +++ b/decoder/LAVVideo/decoders/avcodec.cpp @@ -56,24 +56,11 @@ static DXVA2_ExtendedFormat GetDXVA2ExtendedFlags(AVCodecContext *ctx, AVFrame * DXVA2_ExtendedFormat fmt; ZeroMemory(&fmt, sizeof(fmt)); - fillDXVAExtFormat(fmt, -1, ctx->color_primaries, ctx->colorspace, ctx->color_trc); + fillDXVAExtFormat(fmt, -1, ctx->color_primaries, ctx->colorspace, ctx->color_trc, ctx->chroma_sample_location); if (frame->format == AV_PIX_FMT_XYZ12LE || frame->format == AV_PIX_FMT_XYZ12BE) fmt.VideoPrimaries = DXVA2_VideoPrimaries_BT709; - // Chroma location - switch(ctx->chroma_sample_location) { - case AVCHROMA_LOC_LEFT: - fmt.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2; - break; - case AVCHROMA_LOC_CENTER: - fmt.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG1; - break; - case AVCHROMA_LOC_TOPLEFT: - fmt.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_Cosited; - break; - } - // Color Range, 0-255 or 16-235 BOOL ffFullRange = (ctx->color_range == AVCOL_RANGE_JPEG) || frame->format == AV_PIX_FMT_YUVJ420P || frame->format == AV_PIX_FMT_YUVJ422P || frame->format == AV_PIX_FMT_YUVJ444P @@ -936,20 +923,7 @@ STDMETHODIMP CDecAvcodec::Decode(const BYTE *buffer, int buflen, REFERENCE_TIME if (sdHDR->size == sizeof(AVMasteringDisplayMetadata)) { AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sdHDR->data; MediaSideDataHDR * hdr = (MediaSideDataHDR *)AddLAVFrameSideData(pOutFrame, IID_MediaSideDataHDR, sizeof(MediaSideDataHDR)); - if (hdr) { - // avcodec exports the display primaries in RGB order, we export them in GBR - hdr->display_primaries_x[0] = av_q2d(metadata->display_primaries[1][0]); - hdr->display_primaries_y[0] = av_q2d(metadata->display_primaries[1][1]); - hdr->display_primaries_x[1] = av_q2d(metadata->display_primaries[2][0]); - hdr->display_primaries_y[1] = av_q2d(metadata->display_primaries[2][1]); - hdr->display_primaries_x[2] = av_q2d(metadata->display_primaries[0][0]); - hdr->display_primaries_y[2] = av_q2d(metadata->display_primaries[0][1]); - - hdr->white_point_x = av_q2d(metadata->white_point[0]); - hdr->white_point_y = av_q2d(metadata->white_point[1]); - hdr->max_display_mastering_luminance = av_q2d(metadata->max_luminance); - hdr->min_display_mastering_luminance = av_q2d(metadata->min_luminance); - } + processFFHDRData(hdr, metadata); } else { DbgLog((LOG_TRACE, 10, L"::Decode(): Found HDR data of an unexpected size (%d)", sdHDR->size)); |