summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-01-12 11:54:53 +0100
committerwm4 <wm4@nowhere>2017-01-12 13:58:28 +0100
commit162c2e2d00c46c989fdf116181a21f8701ad99be (patch)
treea044d103854116494d43449a667bf51556266886
parent26d25d567f49d0f98f7c21a18be7bd921e351f8d (diff)
downloadmpv-162c2e2d00c46c989fdf116181a21f8701ad99be.tar.bz2
mpv-162c2e2d00c46c989fdf116181a21f8701ad99be.tar.xz
vd_lavc, mp_image: remove code duplication for AVFrame<->mp_image
Mostly affects conversion of the colorimetric parameters. Not changing AV_FRAME_DATA_MASTERING_DISPLAY_METADATA handling - that's too messy, as decoders typically output it for keyframes only, and would require weird caching that can't even be done on the level of the frame rewrapping functions.
-rw-r--r--video/decode/vd_lavc.c32
-rw-r--r--video/mp_image.c14
2 files changed, 19 insertions, 27 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index 227401a677..8a2070df79 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -618,7 +618,7 @@ static void uninit_avctx(struct dec_video *vd)
}
static void update_image_params(struct dec_video *vd, AVFrame *frame,
- struct mp_image_params *out_params)
+ struct mp_image_params *params)
{
vd_ffmpeg_ctx *ctx = vd->priv;
@@ -642,29 +642,9 @@ static void update_image_params(struct dec_video *vd, AVFrame *frame,
}
#endif
- *out_params = (struct mp_image_params) {
- .imgfmt = pixfmt2imgfmt(frame->format),
- .w = frame->width,
- .h = frame->height,
- .p_w = frame->sample_aspect_ratio.num,
- .p_h = frame->sample_aspect_ratio.den,
- .color = {
- .space = avcol_spc_to_mp_csp(frame->colorspace),
- .levels = avcol_range_to_mp_csp_levels(frame->color_range),
- .primaries = avcol_pri_to_mp_csp_prim(frame->color_primaries),
- .gamma = avcol_trc_to_mp_csp_trc(frame->color_trc),
- .sig_peak = ctx->cached_hdr_peak,
- },
- .chroma_location =
- avchroma_location_to_mp(ctx->avctx->chroma_sample_location),
- .rotate = vd->codec->rotate,
- .stereo_in = vd->codec->stereo_mode,
- };
-
- if (frame->hw_frames_ctx) {
- AVHWFramesContext *fctx = (void *)frame->hw_frames_ctx->data;
- out_params->hw_subfmt = pixfmt2imgfmt(fctx->sw_format);
- }
+ params->color.sig_peak = ctx->cached_hdr_peak;
+ params->rotate = vd->codec->rotate;
+ params->stereo_in = vd->codec->stereo_mode;
}
static enum AVPixelFormat get_format_hwdec(struct AVCodecContext *avctx,
@@ -895,9 +875,7 @@ static bool decode_frame(struct dec_video *vd)
mp_pts_from_av(av_frame_get_pkt_duration(ctx->pic), &ctx->codec_timebase);
#endif
- struct mp_image_params params;
- update_image_params(vd, ctx->pic, &params);
- mp_image_set_params(mpi, &params);
+ update_image_params(vd, ctx->pic, &mpi->params);
av_frame_unref(ctx->pic);
diff --git a/video/mp_image.c b/video/mp_image.c
index 9781386129..37d8f67343 100644
--- a/video/mp_image.c
+++ b/video/mp_image.c
@@ -712,6 +712,15 @@ static void mp_image_copy_fields_from_av_frame(struct mp_image *dst,
AVHWFramesContext *fctx = (void *)src->hw_frames_ctx->data;
dst->params.hw_subfmt = pixfmt2imgfmt(fctx->sw_format);
}
+
+ dst->params.color = (struct mp_colorspace){
+ .space = avcol_spc_to_mp_csp(src->colorspace),
+ .levels = avcol_range_to_mp_csp_levels(src->color_range),
+ .primaries = avcol_pri_to_mp_csp_prim(src->color_primaries),
+ .gamma = avcol_trc_to_mp_csp_trc(src->color_trc),
+ };
+
+ dst->params.chroma_location = avchroma_location_to_mp(src->chroma_location);
}
// Copy properties and data of the mp_image into the AVFrame, without taking
@@ -742,6 +751,11 @@ static void mp_image_copy_fields_to_av_frame(struct AVFrame *dst,
dst->colorspace = mp_csp_to_avcol_spc(src->params.color.space);
dst->color_range = mp_csp_levels_to_avcol_range(src->params.color.levels);
+ dst->color_primaries =
+ mp_csp_prim_to_avcol_pri(src->params.color.primaries);
+ dst->color_trc = mp_csp_trc_to_avcol_trc(src->params.color.gamma);
+
+ dst->chroma_location = mp_chroma_location_to_av(src->params.chroma_location);
}
// Create a new mp_image reference to av_frame.