summaryrefslogtreecommitdiffstats
path: root/video/decode
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 /video/decode
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.
Diffstat (limited to 'video/decode')
-rw-r--r--video/decode/vd_lavc.c32
1 files changed, 5 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);