Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2016-11-28 17:21:49 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2016-11-28 17:21:49 +0300
commit5ed89f9c263b3edaec2c62c27f1b49cc701cd6ef (patch)
tree121a33a54942c0493e5f446687da05a4f5cac852 /decoder
parentbd5e23f19a71b45ed2ccad3c40483bdf90f51585 (diff)
Factor more generic format code out of the avcodec module
Diffstat (limited to 'decoder')
-rw-r--r--decoder/LAVVideo/Media.cpp39
-rw-r--r--decoder/LAVVideo/Media.h6
-rw-r--r--decoder/LAVVideo/decoders/avcodec.cpp30
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));