diff libmpcodecs/vd_ffmpeg.c @ 36418:155e6100949c

Code changes to avoid additional unnecessary re-inits.
author reimar
date Sat, 16 Nov 2013 23:23:46 +0000
parents 9e68e53481e4
children b2dfbef1ac29
line wrap: on
line diff
--- a/libmpcodecs/vd_ffmpeg.c	Sat Nov 16 08:10:04 2013 +0000
+++ b/libmpcodecs/vd_ffmpeg.c	Sat Nov 16 23:23:46 2013 +0000
@@ -605,6 +605,15 @@
     vd_ffmpeg_ctx *ctx = sh->context;
     const AVCodecContext *avctx = ctx->avctx;
     int width, height;
+    int i;
+
+    // avoid initialization for formats not on the supported
+    // list in the codecs.conf entry.
+    for (i = 0; i < CODECS_MAX_OUTFMT; i++)
+        if (sh->codec->outfmt[i] == pixfmt2imgfmt2(pix_fmt, avctx->codec_id))
+            break;
+    if (i == CODECS_MAX_OUTFMT)
+        return -1;
 
     width = avctx->width;
     height = avctx->height;
@@ -622,14 +631,6 @@
     update_configuration(sh, pix_fmt);
     if (!ctx->vo_initialized)
     {
-        int i;
-        // avoid initialization for formats not on the supported
-        // list in the codecs.conf entry.
-        for (i = 0; i < CODECS_MAX_OUTFMT; i++)
-            if (sh->codec->outfmt[i] == ctx->best_csp)
-                break;
-        if (i == CODECS_MAX_OUTFMT)
-            return -1;
         sh->disp_w = width;
         sh->disp_h = height;
         if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp))
@@ -1094,8 +1095,14 @@
     enum AVPixelFormat selected_format;
     int imgfmt;
     sh_video_t *sh = avctx->opaque;
+    vd_ffmpeg_ctx *ctx = sh->context;
     int i;
 
+    // Try to select identical format to avoid reinitializations
+    if (ctx->vo_initialized && ctx->pix_fmt != AV_PIX_FMT_NONE)
+        for (i = 0; fmt[i] != AV_PIX_FMT_NONE; i++)
+            if (fmt[i] == ctx->pix_fmt) return ctx->pix_fmt;
+
     for(i=0;fmt[i]!=PIX_FMT_NONE;i++){
         // it is incorrect of FFmpeg to even offer these, filter them out
         if(!(avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) &&